select一个列的值不同的最近3个logging
我有下面的表格:
id time text otheridentifier ------------------------------------------- 1 6 apple 4 2 7 orange 4 3 8 banana 3 4 9 pear 3 5 10 grape 2
我想要做的是select3个最近的logging(按时间desc),其他otheridentifier
是不同的。 所以在这种情况下,结果将是id
的:5,4和2。
id
= 3将被跳过,因为有一个更新的logging与相同的其他otheridentifier
字段。
这是我试图做的:
SELECT * FROM `table` GROUP BY (`otheridentifier`) ORDER BY `time` DESC LIMIT 3
但是,我最终得到id
= 5,3和1行,而不是5,4,2预期。
有人可以告诉我为什么这个查询不会返回我所期望的? 我试着将ORDER BY更改为ASC,但这只是简单地将返回的行重新排列为1,3,5。
它不会返回所期望的结果,因为在sorting之前发生分组,这正如SQL语句中子句的位置所反映的那样。 不幸的是,你将不得不花更多的时间来获得你想要的行。 尝试这个:
SELECT * FROM `table` WHERE `id` = ( SELECT `id` FROM `table` as `alt` WHERE `alt`.`otheridentifier` = `table`.`otheridentifier` ORDER BY `time` DESC LIMIT 1 ) ORDER BY `time` DESC LIMIT 3
你可以自己join表格来过滤每个其他otheridentifier
的最后一个条目,然后取出最前面的3行:
SELECT last.* FROM `table` last LEFT JOIN `table` prev ON prev.`otheridentifier` = last.`otheridentifier` AND prev.`time` < last.`time` WHERE prev.`id` is null ORDER BY last.`time` DESC LIMIT 3
我有类似的要求,但我有更先进的select标准。 使用一些其他的答案,我不能得到确切的,我需要,但我发现你仍然可以做一个GROUP BY之后和ORDER BY像这样:
SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t GROUP BY t.otheridentifier
SELECT * FROM table t1 WHERE t1.time = (SELECT MAX(time) FROM table t2 WHERE t2.otheridentifier = t1.otheridentifier)
Andomar的答案可能是最好的,因为它不使用子查询。
另一种方法:
select * from `table` t1 where t1.`time` in ( select max(s2.`time`) from `table` t2 group by t2.otheridentifier )
你可以使用这个查询来得到正确的答案:
SELECT * FROM (SELECT * FROM `table` order by time DESC) t group by otheridentifier
关于什么
SELECT *, max(time) FROM `table` group by otheridentifier
这也是:
SELECT * FROM OrigTable T INNER JOIN ( SELECT otheridentifier,max(time) AS duration FROM T GROUP BY otheridentifier) S ON S.duration = T.time AND S.otheridentifier = T.otheridentifier.