例子
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.111com.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.111com.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
|