Mis*_*hko 5 mysql sql distinct sql-order-by
以下SQL查询:
SELECT messages.id, messages.created_at, comments.created_at FROM messages
LEFT JOIN comments ON comments.message_id = messages.id
WHERE (messages.id IN (429,443))
ORDER BY GREATEST(messages.created_at, comments.created_at) DESC
Run Code Online (Sandbox Code Playgroud)
收益:
id messages.created_at comments.created_at
--------------------------------------------------------
443 2 5
429 1 4
443 2 3
(I replaced dates with numbers for readability)
Run Code Online (Sandbox Code Playgroud)
为了让每id
一次我说DISTINCT
:
SELECT DISTINCT messages.id FROM messages
LEFT JOIN comments ON comments.message_id = messages.id
WHERE (messages.id IN (429,443))
ORDER BY GREATEST(messages.created_at, comments.created_at) DESC
Run Code Online (Sandbox Code Playgroud)
但是,在结果中id
值改变了顺序:
id
---
429
443
Run Code Online (Sandbox Code Playgroud)
可能是什么原因?
我怎么能保留订单?
Sin*_*ion 15
该distinct
关键字是做什么它应该做的事情,回报每一个行与给定的列值.Distinct不允许您指定将返回哪一行,并且从原始查询中可以清楚地看到允许这样的排序(在id为429的行之后有一行ID为443).
要控制将返回的行,您需要重新构造查询.我将采用一种典型的解决方案是使用a group by
,从每个组中选择组列和所需的行,以达到效果
SELECT message.id, MAX(message.created_at) FROM message GROUP BY message.id;
Run Code Online (Sandbox Code Playgroud)
如果我需要做更多,我将使用这种查询作为更大查询中的子选择,可能加入id字段以从首选行获取更多字段,或者以特定方式排序查询.
归档时间: |
|
查看次数: |
6951 次 |
最近记录: |