2012-08-31 166 views
1

我試圖將對話之類的消息進行分組,並僅顯示來自對話的最新消息,因此我需要列time中列數最多的消息。MySQL Group by and Order

這是我的查詢:

SELECT * 
FROM console_msgs 
WHERE `to` = $user[id] 
GROUP BY `from` 
ORDER BY time DESC 

感謝您的幫助!

+1

你可以發佈/包含你的表結構,以便每個人都可以看到涉及的表。 –

+0

我們可能需要您的模式定義,以及一些示例數據和結果。永遠不要使用'SELECT *' - 總是明確地定義你想要的結果。命名事物時避免使用保留字 - 「from」可能會重命名爲「sentBy」或其他東西。不要不必要地縮寫,這隻會讓閱讀變得更加困難。不要在他們的類型之後命名列,在它們代表的內容之後命名它們 - 即「time」代表「sentAt」還是「receivedAt」?請注意,雖然在mySQL中是合法的,但在使用GROUP BY時選擇非聚合列具有「隨機」值。 –

回答

1

你想要groupwise maximum

SELECT console_msgs.* 
FROM console_msgs NATURAL JOIN (
     SELECT MAX(time) AS time 
     FROM  console_msgs 
     WHERE `to` = $user[id] 
     GROUP BY `from` 
     ) t 
WHERE `to` = $user[id] 
+0

獲取此錯誤:每個派生表都必須有自己的別名 – albin

+0

謝謝!完美的作品! – albin

0

我不太明白您需要返回的結果集,但我認爲您需要使用LIMIT關鍵字才能返回最高結果。這給一試:

SELECT from, MAX(time) 
FROM console_msgs 
WHERE `to` = $user[id] 
GROUP BY `from` 
ORDER BY time DESC 
LIMIT 1 
+0

我認爲OP希望來自*每個*發件人的最新消息,而不僅僅是最新的消息(您的答案甚至可能不會這樣做,因爲所選的「時間」值是不確定的)。 – eggyal

0

你不會想用GROUP BY達到什麼我想你問。你只是想多個訂單bys

SELECT * 
FROM console_msgs 
WHERE `to` = $user[id] 
ORDER BY `from`, time DESC