類如 有一個 文章的回複表,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弱智的地方,也許是我還沒有發現.