数据库
首页 > 数据库> > mysql-SQL查询帮助-每个不同的列值有10条记录

mysql-SQL查询帮助-每个不同的列值有10条记录

作者:互联网

我有一个汽车表,其中包含汽车清单.
表结构如下所示:

 cars
   - id
   - title
   - make
   - year

我想要一个查询,该查询返回每个品牌的10辆汽车.

等效于以下伪代码的内容:

car_makes = select distinct make from cars
for each make in car_makes 
  select id, title, make from clcars where make = $make limit 10;
end

这是我尝试失败的结果:

select id,title,make 
from cars where make in 
                    (select distinct make from cars) 
group by make;

—每次返回仅返回一条记录.

select a.id,a.title,a.make 
from cars a left join  
 (select distinct make from cars) car_make 
   on a.make = car_make.make;

这将返回每条记录.

我每辆汽车只需要10条记录.

谢谢你的帮助

解决方法:

这将给您您想要的:

set @prev := '', @i := 0;
select  make, id, title, year
from (select id, title, make, year, (@i := if(@prev = make, @i + 1, 0)) as idx, (@prev := make)
from (select id, title, make, year from cars order by make, id) ordered) indexed
where idx < 10

要更改获取哪10行的选择,请更改最内层查询的顺序;我按制造商,ID选择ID顺序,但可以选择年份.只要make首先,它将起作用.您可以选择“随机”选择其他任何东西.
根据需要订购最终结果.

工作原理:

>最里面的查询只是对准备好编号的行进行排序-别名为已排序
>下一个包装器查询将计算make组(别名为索引)中的行号(@i-从零开始计数). @prev保存上一行的品牌
>外部查询从行号小于10的索引中选择数据

这是测试代码,边缘情况为1宝马,3 gmc和13福特:

create table cars (id int not null primary key auto_increment, title text, make text, year text);
insert into cars (title, make, year) values 
('f1', 'ford', 2000), ('f2', 'ford', 2001), ('f3', 'ford', 2002), ('f4', 'ford', 2003),
('f5', 'ford', 2004), ('f6', 'ford', 2005), ('f7', 'ford', 2006), ('f8', 'ford', 2007),
('f9', 'ford', 2008), ('f10', 'ford', 2009), ('f11', 'ford', 2010), ('f12', 'ford', 2011),
('f13', 'ford', 2012), ('g1', 'gmc', 2000), ('g2', 'gmc', 2001), ('g3', 'gmc', 2002), 
('b1', 'bmw', 2002);

以上查询的输出:

+------+----+-------+------+
| make | id | title | year |
+------+----+-------+------+
| bmw  | 17 | b1    | 2002 |
| ford |  1 | f1    | 2000 |
| ford |  2 | f2    | 2001 |
| ford |  3 | f3    | 2002 |
| ford |  4 | f4    | 2003 |
| ford |  5 | f5    | 2004 |
| ford |  6 | f6    | 2005 |
| ford |  7 | f7    | 2006 |
| ford |  8 | f8    | 2007 |
| ford |  9 | f9    | 2008 |
| ford | 10 | f10   | 2009 |
| gmc  | 14 | g1    | 2000 |
| gmc  | 15 | g2    | 2001 |
| gmc  | 16 | g3    | 2002 |
+------+----+-------+------+

标签:greatest-n-per-group,sql,mysql
来源: https://codeday.me/bug/20191102/1990404.html