類如 有一個 帖子的回復表,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
也有網友利用自連接實現的 ,這樣的效率應該比上面的子查詢效率高,不過,為了簡單明了,就只用這樣一種了,GROUP BY沒有排序功能,可能是mysql弱智的地方,也許是我還沒有發現.