有兩個版本的查詢。無論是做完全是我需要..在MySQL的JOIN內部進行排序 - 每個用戶的最新信息
試圖返回的所有用戶,與最新消息的時間一起發送要麼或從用戶。一個額外的標誌顯示最後一條消息是從當前行中的用戶(因此他們是否'等待迴應')。
最後,需要對整個結果集進行排序,讓這些用戶首先等待響應,然後在最新消息的時間點排序。
版本1:
SELECT `users`.*,
MAX(`messages`.`time_sent`) AS `_message_time_sent`,
(`messages`.`user_id` = `users`.`id`) AS `_message_awaiting_response`
FROM `users` LEFT JOIN `messages`
ON (`messages`.`user_id` = `users`.`id` OR `messages`.`to_user_id` = `users`.`id`)
GROUP BY `users`.`id`
ORDER BY `_message_awaiting_response` DESC, `messages`.`time_sent` DESC
版本1的問題:從哪個消息最早出現在之前的加入「_message_sent_time」是正確的(通過MAX),但「_message_awaiting_response」標誌總是派生MAX()發生,這可能不是最新的消息。
版本2:
SELECT DISTINCT `users`.*,
`messages`.`time_sent` AS `_message_time_sent`,
(`messages`.`user_id` = `users`.`id`) AS `_message_awaiting_response`
FROM `users` LEFT JOIN `messages`
ON (`messages`.`user_id` = `users`.`id` OR `messages`.`to_user_id` = `users`.`id`)
GROUP BY `users`.`id`
ORDER BY `_message_awaiting_response` DESC, `messages`.`time_sent` DESC
隨着2.0版本,這個問題主要是相同的 - 因爲那裏是沒有MAX()聚合函數,第一條消息中加入(不是最近的)發現的由DISTINCT單出。
有沒有一種簡單的方法來確保最新消息在這裏被定位?
P.S.它需要在MySQL 4的工作;)
哎呀,我的壞..想表明誰去過用戶等待最早的迴應第一,所以第二個命令應該是'messages'.'time_sent' ASC –