第一步:准备数据:
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因为这样会出现文件内排序。