SQL:如何使用DISTINCT保持行顺序?

时间:2011-08-11 12:55:23

标签: mysql sql sql-order-by distinct

以下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)

只有在我添加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

但是,在结果中id值更改了顺序:

id
---
429
443

可能是什么原因?

我怎么能保留订单?

1 个答案:

答案 0 :(得分:14)

distinct关键字正在做它应该做的事情,每个返回一行给定的列值。 Distinct不允许您指定将返回哪个这样的行,并且从原始查询中可以清楚地看到允许这样的排序(在id为429的行之后有一行id为443的行)。

要控制将返回的行,您需要重新构造查询。我将采用的典型解决方案是使用group by,从每个组中选择组列和所需的行,以实现

的效果。
SELECT message.id, MAX(message.created_at) FROM message GROUP BY message.id;

如果我需要做更多,我将使用这种查询作为更大查询中的子选择,可能加入id字段以从首选行获取更多字段,或者以特定方式对查询进行排序。