如何在SQL中先排序后分组

原文地址入口

标题说的有点奇怪,换句话说是让order by比group by先执行。还不明白对吧?
举个例子:实现场景,要实现QQ空间的动态消息,首先要按最新的消息查到QQ好友排序,然后再按好友分别查询他们的动态消息

有如下的Feed表

id	userid	type		msg	who	time
1	2	add_twitter		hahah	1	2010-04-27 19:12:38
2	2	add_twitter		怎么啦	2	2010-04-27 19:12:44
3	4	add_twitter		asddas	3	2010-04-27 19:20:26
4	2	reply_twitter		放大法	4	2010-04-27 19:24:09
5	5	reply_twitter		噶	5	2010-04-27 19:24:13
6	3	add_twitter		saf	6	2010-04-27 19:35:48
7	2	add_twitter		先谢谢谢谢谢谢	7	2010-04-27 19:54:44

现在想要,按时间先后,把用户的id查询出来,每个id只出现一次。

当然,第一时间就想到用group by语句来分组嘛

SELECT * FROM feed GROUP BY userid ORDER BY TIME


可是,得到的结果并不是自己想要的,group by比order by先解析了,结果就是得到最旧的那一条。

正确的方法

使用子查询

SELECT * FROM
(SELECT * FROM feed ORDER BY TIME) AS T 
GROUP BY T.userid ORDER BY T.TIME

上面这句在mysql可以正常取值,但是在hibernate不能使用from 后面的子查询,杯具。。
换个折中的方法,以下方法只是为了取得userid而已

SELECT * FROM feed GROUP BY userid ORDER BY MAX(TIME)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值