記得以前老師跟我講sql中group by與order by 不能同時使用,使用時會有問題,后來我工作了發現他講的是錯誤的,其實mysql group by 與排序是可使用的,只要我們稍加處理。
類如有一個 帖子的回復表,posts(id,tid,subject,message,dateline).
id為 自動增長字段,tid為該回復的主題帖子的id(外鍵關聯),subject 為回復標題, message 為回復內容,dateline 為回復時間,用UNIX 時間戳表示.
現在要求 選出 前十個來自不同主題的最新回復,代碼如下:
SELECT * FROM posts GROUP BY tid LIMIT 10
這樣一個sql語句選出來的并非你想要的 最新的回復,而是最早的回復,實際上是某篇主題的第一條回復記錄.
也就是說 GROUP BY 語句沒有排序,那么怎么才能讓 GROUP 按照 dateline 倒序排列呢?加上 order by 子句?
group by 后order by不準確問題,解決如下:
錯誤語句,代碼如下:
select A.id, A.type, B.id, B.h1 from A,B where A.type=3 and A.id=B.id group by B.id order by A.id desc limit 10
正確語句,代碼如下:
select A.id, A.type, B.id, B.h1 from A,B where A.type=3 and A.id=B.id group by B.id order by max(A.id) desc limit 10
最簡單的,代碼如下:
- SELECT * FROM (SELECT * FROM posts ORDER BY dateline DESC) AS p GROUP BY tid ORDER BY dateline DESC LIMIT 10 --Vevb.com
也有網友利用自連接實現的,這樣的效率應該比上面的子查詢效率高,不過,為了簡單明了,就只用這樣一種了,GROUP BY沒有排序功能,可能是mysql弱智的地方,也許是我還沒有發現.
新聞熱點
疑難解答