例子
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