【发布时间】:2011-08-11 12:55:23
【问题描述】:
以下 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
返回:
id messages.created_at comments.created_at
--------------------------------------------------------
443 2 5
429 1 4
443 2 3
(I replaced dates with numbers for readability)
只有在我添加DISTINCT 后才能获得每个id:
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
但是,结果id 值改变了顺序:
id
---
429
443
这可能是什么原因?
我怎样才能保持订单?
【问题讨论】:
-
我的猜测是 mysql 在找到前两个匹配项并相应地对它们进行排序后停止。很可能最后两个条目首先被找到,因为根据您对 created_at 的使用判断它们是首先插入的。
-
我不确定,但你真的不知道在 distinct 之后保留了哪些行。我不确定mysql是如何做到的。看到您运行两个查询并包含两个 created_at 列会很有趣。
-
SELECT messages.id, messages.created_at, comments.created_at所以我们可以看到其他列的值,因为这是您订购的内容。我猜429的 created_at 比443的 created_at 高
标签: mysql sql sql-order-by distinct