为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哆啦的时光机 2019-11-30 10:37:47
我有下表:    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。
查看完整描述

3 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

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


查看完整回答
反对 回复 2019-11-30
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

您可以将表本身联接起来以过滤per的最后一个条目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


查看完整回答
反对 回复 2019-11-30
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

我有类似的要求,但选择标准更高。使用其他一些答案,我无法确切获得所需的信息,但是我发现您仍然可以像下面这样执行GROUP BY和ORDER BY:


SELECT t.* FROM (SELECT * FROM table ORDER BY time DESC) t 

GROUP BY t.otheridentifier


查看完整回答
反对 回复 2019-11-30
  • 3 回答
  • 0 关注
  • 515 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信