当前位置: 首页 > 面试题库 >

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

劳高爽
2023-03-14
问题内容

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

 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 order by make, id,但您可以选择年份。只要make是第一次,它将起作用。您可以选择“随机”选择其他任何东西。根据需要订购最终结果。

工作原理:

  • 最里面的查询只是对准备好编号的行进行排序-别名为 ordered
  • 下一个包装查询将计算@imake组中的行号(从零开始计数),别名为indexed@prev保留上一行的品牌
  • 外部查询从indexed行号小于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 |
+------+----+-------+------+


 类似资料:
  • 我有3张桌子 许可证中的CREATED_AT是一个日期(非空)字段。 表根据同名主键/外键进行关联;客户可以拥有0个或多个许可证,每个许可证都有一个版本。 我想从这些表格中得到: 客户的名字、姓氏和创建的最后一个许可证的release\u id(根据许可证中的created\u AT字段查找最后一个),如果有。 对于这个问题,我使用了以下查询: 这似乎有效,但我问是否有人可以证实我这一点,或者是否

  • 问题内容: 我有一张桌子,上面有一张图表中的数据。 例如 我需要一个查询,该查询返回值在局部最大值处的结果,即特定索引处的值大于index + 1和index-1处的值。 因此,对于示例集,它应返回索引列表:2、6、9,它们对应于值7、12、14。 我在SQLite中使用PHP。我可以用php中的foreach循环来做到这一点,但想知道是否有一种简单的方法可以仅使用SQL命令来做到这一点。 任何输

  • 问题内容: 好吧,我可能也已在较早之前发布了此内容,但到目前为止仍找不到答案,因此请帮助我解决这个问题。 我的数据库结构: ATT (表) Act_ID(PK) Assigned_To_ID(FK,请参阅) Project_ID(FK,请参阅) Product_ID(FK,请参阅) 状态(可以是) 产品表 产品编号(PK) 产品名称 项目表 Project_ID(PK) 项目名 员工表 Emp_I

  • 问题内容: 如果我有一个包含以下字段的表格 我将如何编写查询以返回每个的最新/前3个项目(基于)。 因此,结果可能看起来像 返回特定的最新项目很容易,但是我只是不认为如何针对上述情况进行操作。我也觉得它应该死得很简单! 编辑: 抱歉,我错过了一些关键信息。这是针对SQL2000的,因此无法使用! 问题答案: 对于SQL 2000,我建议升级到受支持的平台。 但是如果你坚持的话。

  • 我的问题类似于SQL选择组查询。但是架构发生了变化,我想要不同的结果,如下所述。给定链接的解决方案没有给我正确的解决方案。您可以使用SQL小提琴来解决这个问题。 下面是我的桌子 表1 现在,我想显示每个产品的两个最低金额,如果金额相同,那么任何人都按照升序排列... 所以我想构建单个SQL查询,它给我的结果如下。 请帮我建立这样的查询。

  • 问题内容: 我需要从下表中删除半重复记录 对于存在的任何重复PID,我想删除最低得分记录。在上面的示例中,将删除ID 1。我试图提出一种不使用循环的方法,但确实很挣扎。 任何帮助,将不胜感激。 谢谢 问题答案: