选择3条最新记录,其中一列的值是不同的

我有下表:


    id       time      text      otheridentifier

    -------------------------------------------

    1        6         apple     4

    2        7         orange    4

    3        8         banana    3

    4        9         pear      3

    5        10        grape     2

我想做的是选择3条最近的记录(按时间desc),它们的otheridentifiers是不同的。因此,在这种情况下,结果将是id:5、4和2。


id= 3将被跳过,因为有相同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。


哆啦的时光机
浏览 516回答 3
3回答

慕侠2389804

它不会返回您期望的结果,因为分组是在排序之前发生的,这从子句在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` DESCLIMIT 3

陪伴而非守候

您可以将表本身联接起来以过滤per的最后一个条目otheridentifier,然后采用该表的前3行:SELECT last.*FROM `table` lastLEFT JOIN `table` prev&nbsp;&nbsp; &nbsp; ON prev.`otheridentifier` = last.`otheridentifier`&nbsp; &nbsp; AND prev.`time` < last.`time`WHERE prev.`id` is nullORDER BY last.`time` DESC&nbsp;LIMIT 3

慕丝7291255

我有类似的要求,但选择标准更高。使用其他一些答案,我无法确切获得所需的信息,但是我发现您仍然可以像下面这样执行GROUP BY和ORDER BY:SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t&nbsp;GROUP BY t.otheridentifier
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MySQL