我想要表现的是:
使用IN从表中选择一些行,但是当我的查询与行匹配时,我需要它来匹配那些具有最新update_date的行。
更多解释:
所以我们有这个表
id update_date value record_id
1 2015-01-01 1 1
2 2015-01-02 2 1
3 2015-01-03 3 1
4 2015-02-02 100 2
5 2015-02-03 101 2
基本上我的SQL查询将是这样的:
select * from `table` WHERE `record_id` IN (1,2,3)
它将返回5行。
我需要的是返回2行:
id update_date value record_id
3 2015-01-03 3 1
5 2015-02-03 101 2
如果你仔细看看,那些是具有最新更新日期的那些。 我在一个查询中需要这个,但我不太确定它是否可能。
提前致谢
注意:某些record_ids可能缺失
答案 0 :(得分:2)
查找子查询中每条记录的最大更新日期。然后join
表返回以获取其余字段:
select t.*
from (select record_id, max(update_date) as maxud
from `table`
where `record_id` IN (1, 2, 3)
group by record_id
) r join
`table` t
on r.record_id = t.record_id and r.maxud = t.update_date
答案 1 :(得分:0)
试试这个:
SELECT mr.*
FROM `table` mr # "mr" from "most recent"
LEFT JOIN `table` nt # "nt" from "newer than" (most recent)
ON mr.record_id = nt.record_id AND mr.update_date < nt.update_date
WHERE mr.record_id IN (1, 2, 3) # your filter here
AND nt.record_id IS NULL
它将表(别名为mr
)与其自身(别名为nt
)连接起来。 LEFT JOIN
确保mr
(左侧的表)中的所有记录都出现在已连接的集合中。来自mr
的{{1}}中的每一行都会nt
中record_id
列上具有相同值并且更新(mr.update_date < nt.update_date
)的所有行。如果nt
中没有此类记录(因为从mr
中选择的行是最新的),则nt
中的字段将填充NULL
。
WHERE
条件nt.record_id IS NULL
仅保留已加入的集合中来自mr
的{{1}}中没有对的记录({{1}中没有最近的行因为nt
中的行是最新的行。
nt
子句中的另一个条件(始终放在mr
的字段中)首先进行了您想要的过滤。
最后,WHERE
mt
所需的字段(因为来自SELECT
的字段都是mr
)。