今天在做一个微信的在线客服系统的时候,东西需要从一个表中调最近的用户,但是这个表是一个消息记录表结构如下,例子:
- IDuidcontentweidaddtime
- 12321312312…..
- 23321312312….
- 3232131212…
- 31xxx123232
我们的需求是从消息表中掉出来最近的用户,刚开始的时候用的是这样写的,代码如下:
- SELECTf.*
- FROM`enet_wechat_message`ASm
- LEFTJOIN`enet_wechatfans`ASfONm.fakeid=f.openid
- ANDm.weid=135
- ANDf.weid=135
- WHEREf.fakeidISNOTNULL
- GROUPBYm.fakeid
- ORDERBYm.idDESC
- LIMIT10
但是这些写完之后发现不是我想要的结果,通过查资料发现MYSQL的执行顺序是如下代码:
from… where…group by… having…. select … order by…
这样我最后的ORDER BY 是在GROUP BUY 之后才进行的排序所以数据不是我想要的,采用如下方法可以解决,代码如下:
- SELECT*
- FROM(
- SELECT*
- FROM`enet_wechat_message`
- WHEREweid=135
- ORDERBY`id`DESC
- )`temp`www.phpfensi.com
- GROUPBYfakeid
- ORDERBY`id`DESC
LIMIT 10使用子查询,先对结果集进行排序,然后在进行分组,这样就可以实现我需要最新的几个用户了,当然这个代码的业务逻辑还需要用户的个人信息,所以我最终的代码是如下的:
- SELECTf.*
- FROM(
- SELECT*
- FROM(
- SELECT*
- FROM`enet_wechat_message`
- WHEREweid=135
- ORDERBY`id`DESC
- )`temp`
- GROUPBYfakeid
- ORDERBY`id`DESC
- LIMIT10www.phpfensi.com
- )ASm
- LEFTJOIN`enet_wechatfans`ASfONm.fakeid=f.openid
- WHEREf.fakeidISNOTNULL
- GROUPBYm.fakeid
- ORDERBYm.idDESC