第一步:准备数据:
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<6
sql解释:@tmp_code:=p_code
表示把p_code的值临时赋值给@tmp_code
,IF(@tmp_code=p_code,@tmp_num:=@tmp_num+1,@tmp_num:=0)
表示如果p_code的值等于@tmp_code
的话,@tmp_num
自增1,这样我们就可以通过'tmp_num'
这个字段来获取到每一组的前几条数据
第三步:需求完美解决 查询结果:
执行:
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因为这样会出现文件内排序。
各位大佬如果有更好,更加高效的方法希望可以留言交流下,谢谢
参考: https://blog.csdn.net/MTner/article/details/98336846 https://jingyan.baidu.com/article/d8072ac48d2730ec94cefd43.html