选择IN,过滤匹配的结果

时间:2015-02-10 14:26:47

标签: mysql

我想要表现的是:

使用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可能缺失

2 个答案:

答案 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}}中的每一行都会ntrecord_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)。