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.