今天在做一個微信的在線客服系統(tǒng)的時候,東西需要從一個表中調(diào)最近的用戶,但是這個表是一個消息記錄表結(jié)構(gòu)如下,例子:
- 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
但是這些寫完之后發(fā)現(xiàn)不是我想要的結(jié)果,通過查資料發(fā)現(xiàn)MYSQL的執(zhí)行順序是如下代碼:
from… where…group by… having…. select … order by…
這樣我最后的ORDER BY 是在GROUP BUY 之后才進行的排序所以數(shù)據(jù)不是我想要的,采用如下方法可以解決,代碼如下:
- SELECT *
- FROM (
- SELECT *
- FROM `enet_wechat_message`
- WHERE weid =135
- ORDER BY `id` DESC
- ) `temp` m.survivalescaperooms.com
- GROUP BY fakeid
- ORDER BY `id` DESC
LIMIT 10使用子查詢,先對結(jié)果集進行排序,然后在進行分組,這樣就可以實現(xiàn)我需要最新的幾個用戶了,當(dāng)然這個代碼的業(yè)務(wù)邏輯還需要用戶的個人信息,所以我最終的代碼是如下的:
- 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 m.survivalescaperooms.com
- ) 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
新聞熱點
疑難解答
圖片精選