mysql内连接只获得最后3个等于

时间:2018-03-10 12:22:26

标签: php mysql sql database database-normalization

我希望有人可以帮助我。

我的查询。

SELECT * FROM `tbl_device` 
INNER JOIN `tbl_temperature` ON tbl_device.ID = tbl_temperature.DevID

结果。

Query Results

如何在链接上的照片中看到这样的内容。

tbl_device.DevID

我只需要获取tbl_device.DevID

的最后3个结果

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

非常感谢!

2 个答案:

答案 0 :(得分:1)

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

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

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;

编辑:

这是一种表达逻辑的简单方法。它可能与正确的索引相符:

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 :(得分:1)

应该是

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

订单栏可能与我的示例中的不同。 Google MySQL LIMIT OFFSET

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

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