我对IN
声明有疑问。我有两张桌子。
表1
id | active_device_id| device_status
0 | 1 | 1
1 | 2 | 1
2 | 3 | 1
TABLE_2
id | device_id | value
0 | 1| 10
1 | 2| 20
2 | 3| 30
3 | 1| 40
4 | 2| 50
5 | 5| 60
我希望根据表_1
从表2中获取设备的最后一个值所以我用这个
select *
from Table_2
where device_id in (
select active_device_id
from Table_1
where device_status=1
)
order by id desc
此查询获取设备的所有记录。但我想为每台设备获取最后一条记录。不久我想要这个
id | device_id| value
4 | 2| 50
3 | 1| 40
2 | 3| 30
你能帮我解决这个问题吗?
答案 0 :(得分:2)
使用IN
语句将返回该值匹配的所有记录,这将最终返回Table_2中的所有值,除了id = 5(表1中的device_id为5 isn&t; t)。此外,使用IN
语句可以更好地处理使用INNER JOIN
语句的方式。
实现目标的更好方法是使用自联接。基本上,我将Table_2重新加入到自身,只返回最高的" id"表中与device_id匹配的每一行的值。
SELECT t2.*
FROM Table_2 AS t2
INNER JOIN Table_1 AS t1 ON t2.device_id = t1.active_device_id
AND t1.device_status = 1
LEFT JOIN Table_2 AS t2self ON t2.device_id=t2self.device_id AND t2self.id>t2.id
WHERE t2self.id IS NULL
ORDER BY t2.id DESC
答案 1 :(得分:0)
如果您的DBMS支持窗口函数(顺便说一下),那么有一种稍微简单的方法:
select id, device_id, value from
(
select row_number() over (partition by t2.device_id order by t2.id desc) as rownum,
t2.*
from table_2 t2 join table_1 t1 on t2.device_id = t1.active_device_id and t1.device_status = 1
) temp where rownum = 1
然而,我正在支持Ashley Lee的回答,因为我认为它为其他DBMS提供了一个非常重要的 ANSI-SQL 解决方法作为MySql,通常使用变量来实现相同的效果。