mysql分组 排序 取前2条

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql分组 排序 取前2条相关的知识,希望对你有一定的参考价值。

举例:
id channel_id time
1 111 2010-05-11
2 222 2010-05-11
3 111 2010-05-12
4 222 2010-05-12
5 111 2010-05-13
6 222 2010-05-13
.....
按channel_id分组,time倒序,取前两条
要得效果是:
id channel_id time
1 111 2010-05-13
2 111 2010-05-12
3 222 2010-05-13
4 222 2010-05-12
.....

参考技术A 你可以试试这个,有疑问可HI我。
select * from table a
where
(select count(1) from table b
where a.channel_id=b.channel_id and a.time<b.time)<2
order by channel_id,time desc

具体原理可参看我空 间的文章
SQL分类下的《取得分组TOP-N测试表与测试数据》
参考技术B 没办法,只能子查询,order by 是对查询之后的数据排序,永远在最后执行,个group by合用一点用都没有,能做的就是子查询提高效率。 参考技术C 可以写为 select id,channel_id,time from table where group by channel_id order by time desc limit 2追问

这个真查不出来

追答

恩,抱歉,我没验证过这段sql。我重新确定一下你的需求,上面的例子中你是要
1 111 2010-05-13
2 111 2010-05-12
这两条记录还是
1 111 2010-05-13
3 222 2010-05-13
这两条记录
前一种的话可以写成select id,channel_id,time from table order by channel_id,time desc limit 2
如果是后面一种可以写成select id,channel_id,time from table group by channel_id order by time desc limit 2这里我原本多写了一个where
如果你还需要对channel进行排序的话可以写成select id,channel_id,time from table group by channel_id order by channel_id,time desc limit 2
希望我的回答能对你有所帮助

本回答被提问者采纳
参考技术D exit exit exit exit exit exit

分组后在分组内排序每个分组中取前N条

SELECT p_type,p_name,p_view,row_num from (

SELECT p_type,p_name,p_view,IF(@bak=p_type,@rownum:[email protected]+1,@rownum:=1) as row_num, @bak:=p_type

FROM

( SELECT p_type,p_name,p_view from products 

order by p_type,p_view desc ) a , ( SELECT @rownum:=0,@bak:=‘‘) b 

) c WHERE c.row_num <=2


IF函数

IF(条件,表达式1,表达式2)

 如果条件成立 则返回表达式1,否则是2


以上是关于mysql分组 排序 取前2条的主要内容,如果未能解决你的问题,请参考以下文章

SQL如何对分组后的结果进行排序并且取前几名

Mysql 分组并排序

sql 每个编号按时间排序取前两条数据

分组后在分组内排序每个分组中取前N条

mysql关联表分组查询多条数据

mySQL分组排序