在尝试进行分页时,我遇到了这个问题。我的桌子-
ID CarBrand Car Model
---------------------------
1 Alfa Romeo Guilietta
2 Alfa Romeo Mito
3 Audi A3
4 Audi R8
5 Audi TT
6 Fiat Punto
7 Fiat Panda
8 Ford Mondeo
9 Ford Mustang
10 Nissan Almera
11 Nissan Note
12 Nissan Qashqai
13 Toyota Aygo
14 Toyota Prius
15 Volkswagen Beetle
16 Volkswagen Golf
17 Volkswagen Polo
18 Volkswagen Up
我以两组显示数据:
-Fiat - Punto
Panda
-Ford - Mondeo
Mustang
所以有 2 个品牌,但有 4 个数据库结果。是否可以设置查询限制并将我的结果偏移到两个品牌,同时显示该品牌的所有型号?
对不起,如果我不清楚!
很明显。试试这个:
select * from t t1
join (
select distinct carBrand from t
limit 2
) s on t1.carBrand = s.carBrand
在limit 2
之前,请应用所需的顺序。
若要在不使用 limit
关键字的情况下获取限制,可以施加计数。
例如,给定表定义
create table cars (id int,
carBrand char(10),
carModel char(10));
这将为您提供前 2 个汽车品牌的所有车型
select cars.carBrand, cars.carModel
from cars
where ((select count(*) from
(select distinct carBrand from cars) as carBrands
where carBrands.carBrand < cars.carBrand) < 2)
order by cars.carBrand, cars.carModel;
这将创建一个仅列出carBrands
的内联表,然后将其连接回汽车以获取前 2 个品牌中所有汽车的列表。 count(*) .... < 2
强制执行限制。 考虑'Ford'
,例如,在上述数据中。 在 ' Ford'
的情况下,有 3 个品牌按字母顺序< 'Ford'
,因此上面的count(*)
= 3。 由于 3 不小于 2,因此输出中不会出现'Ford'
汽车。
测试数据的输出将是:
CARBRAND CARMODEL
Alfa Romeo Guilietta
Alfa Romeo Mito
Audi A3
Audi R8
Audi TT
现在,你没有说你想如何选择这两个品牌 - 你只是在你的例子中列出了福特和菲亚特 - 我不知道你是如何选择这些品牌的。 如果你想要字母顺序标准以外的排序标准,这是可行的,但更难。
SQL小提琴和所有这些的结果:http://sqlfiddle.com/#!2/33a8f/3
这是数据库设计的问题。也许您应该将数据拆分为两个表model
(型号名称)和brand
(品牌名称)。然后,您可以编写如下查询:
SELECT m.name, b.name
FROM model m
INNER JOIN brand b
WHERE b.id IN (
SELECT id
FROM brand
ORDER BY name ASC
LIMIT 2 OFFSET 0
)
我没有测试代码。在我看来不需要GROUP BY
。