首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mysql内部连接仅获取最后3个等于

mysql内部连接仅获取最后3个等于
EN

Stack Overflow用户
提问于 2018-03-10 20:22:26
回答 2查看 61关注 0票数 0

我希望有人能帮我。

我的问题。

代码语言:javascript
运行
复制
SELECT * FROM `tbl_device` 
INNER JOIN `tbl_temperature` ON tbl_device.ID = tbl_temperature.DevID

结果。

如何才能获得如链接上的照片所示的东西。

我只需要获取tbl_device.DevID的最后3个结果

我为我糟糕的英语道歉,这真的很难解释。任何帮助都是非常感谢的。

非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2018-03-10 20:26:48

最简单的方法是使用ANSI标准的窗口函数(特别是row_number())。但MySQL (目前)还不支持这些。

在MySQL中,最好的方法可能是使用变量:

代码语言:javascript
运行
复制
SELECT . . .
FROM tbl_device d JOIN
     (SELECT t.*,
             (@rn := if(@d = t.devid, @rn + 1,
                        if(@d := t.devid, 1, 1)
                       )
             ) as rn
      FROM (SELECT t.*
            FROM tbl_temperature t
            ORDER BY DevID, id DESC
           ) t CROSS JOIN
           (SELECT @d := -1, @rn := 0) params
     ) t
     ON tbl_device.ID = tbl_temperature.DevID
WHERE rn <= 3;

编辑:

这里有一种更简单的方式来表达逻辑。如果使用正确的索引,它的性能可能会更好:

代码语言:javascript
运行
复制
SELECT d.*, t.*
FROM tbl_device d INNER JOIN
     tbl_temperature t
     ON d.ID = t.DevID
WHERE t.ID >= (SELECT t2.ID
               FROM tbl_temperature t2
               WHERE t2.DevId = t.DevId
               ORDER BY t2.ID DESC
               OFFSET 2 LIMIT 1
              );

为了提高性能,这可以在tbl_temperature(devid, id)上使用索引。

票数 1
EN

Stack Overflow用户

发布于 2018-03-10 20:28:37

它应该是这样的

代码语言:javascript
运行
复制
SELECT * FROM `tbl_device` 
INNER JOIN `tbl_temperature` ON tbl_device.ID = tbl_temperature.DevID
ORDER BY tbl_temperature.DevID DESC
LIMIT 3 OFFSET 0

order列可以与我的示例中的不同。谷歌MySQL限制偏移量

或者,如果您只需要从一个表中获得最后三个结果,然后将其连接到另一个表,那么它将类似于

代码语言:javascript
运行
复制
SELECT * FROM tbl_device INNER JOIN
(SELECT .... FROM other_table ORDER BY your_column DESC LIMIT 3 OFFSET 0) as 
T1 ON T1.id = tbl_device.ID
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49209028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档