萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql中GROUP BY 和ORDER BY 組合使用注意事項

mysql中GROUP BY 和ORDER BY 組合使用注意事項

今天在做一個微信的在線客服系統的時候,東西需要從一個表中調最近的用戶,但是這個表是一個消息記錄表結構如下

例子

ID  uid  content  weid      addtime 
1  2  3213123  12  …..     
2  3  3213123  12  …. 
3  2  321312  12  … 
3  1  xxx  12  3232 

我們的需求是從消息表中掉出來最近的用戶,剛開始的時候用的是這樣寫的

 代碼如下 復制代碼


SELECT f . *
FROM  `enet_wechat_message` AS m
LEFT JOIN  `enet_wechatfans` AS f ON m.fakeid = f.openid
AND m.weid =135
AND f.weid =135
WHERE f.fakeid IS NOT NULL
GROUP BY m.fakeid
ORDER BY m.id DESC
LIMIT 10


但是這些寫完之後發現不是我想要的結果,通過查資料發現MYSQL的執行順序是

 代碼如下 復制代碼

from… where…group by… having…. select … order by… 

這樣我最後的ORDER BY 是在GROUP BUY 之後才進行的排序所以數據不是我想要的

采用如下方法可以解決

 代碼如下 復制代碼


SELECT *
FROM (

SELECT *
FROM  `enet_wechat_message`
WHERE weid =135
ORDER BY  `id` DESC
) `temp`  www.111cn.net
GROUP BY fakeid
ORDER BY  `id` DESC


LIMIT 10使用子查詢,先對結果集進行排序,然後在進行分組,這樣就可以實現我需要最新的幾個用戶了。當然這個代碼的業務邏輯還需要用戶的個人信息,所以我最終的代碼是如下的

 代碼如下 復制代碼


SELECT f . *
FROM (

SELECT *
FROM (

SELECT *
FROM  `enet_wechat_message`
WHERE weid =135
ORDER BY  `id` DESC
) `temp`
GROUP BY fakeid
ORDER BY  `id` DESC
LIMIT 10 www.111cn.net
) AS m
LEFT JOIN  `enet_wechatfans` AS f ON m.fakeid = f.openid
WHERE f.fakeid IS NOT NULL
GROUP BY m.fakeid
ORDER BY m.id DESC

copyright © 萬盛學電腦網 all rights reserved