mysql表分组后取每组前几条数据方法一

第一步:准备数据:

create table product(
    p_id int(10) primary key auto_increment,
    p_name varchar(10),
    p_code varchar(10)
)comment '商品表'
insert into product values
(1,'name1',1),
(2,'name2',1),
(3,'name3',2),
(4,'name4',2),
(5,'name5',4),
(6,'name6',4),
(7,'name7',3),
(8,'name8',4),
(9,'name9',2),
(10,'name10',2),
(11,'name11',3),
(12,'name12',3);

第二步:查询

需求:按照p_code字段对product表进行分组并取每组的前两条数据

SQL语句:

select * from(
select *,IF(@tmp_code=p_code,@tmp_num:=@tmp_num+1,@tmp_num:=0) 'tmp_num',@tmp_code:=p_code 'tmp_code' from product order by p_code)
a where a.tmp_num<2

sql解释:@tmp_code:=p_code表示吧p_code1的值临时赋值给@tmp_code,IF(@tmp_code=p_code,@tmp_num:=@tmp_num+1,@tmp_num:=0)表示如果p_code的值等于@tmp_code的话,@tmp_num自增1,这样我们就可以通过'tmp_num'这个字段来获取到每一组的前几条数据

第三步:需求完美解决

查询结果:

 

总结:sql语句不足(各位大佬如果有更好,更加高效的方法希望可以留言交流下,谢谢)

执行:

explain (select * from(
select *,IF(@tmp_code=p_code,@tmp_num:=@tmp_num+1,@tmp_num:=0) 'tmp_num',@tmp_code:=p_code 'tmp_code' from product order by p_code)
a where a.tmp_num<2 )

建议在开发环境不要使用order by因为这样会出现文件内排序。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值