仅限于MySQL中的“限制和偏移”

时间:2012-04-09 22:30:59

标签: mysql sql database

在尝试分页时,我遇到了这个问题。 我的桌子 -

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个数据库结果。 是否可以设置查询限制并将我的结果偏移到两个品牌,同时显示该品牌的所有模型?

很抱歉,如果我不清楚的话!

3 个答案:

答案 0 :(得分:3)

很明显。试试这个:

select * from t t1
join (
  select distinct carBrand from t
  limit 2
) s on t1.carBrand = s.carBrand

limit 2应用您想要的订单之前。

答案 1 :(得分:1)

要获得限制,不使用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

现在,你没有说你想如何挑选这2个品牌 - 你刚才在你的例子中列出了福特和菲亚特 - 我不知道你是怎么碰到这些的。如果你想要一些非按字母顺序排序的标准,这是可行的,但更难。

SQL小提琴和所有这些的结果:http://sqlfiddle.com/#!2/33a8f/3

答案 2 :(得分:0)

这是数据库设计的问题。也许您应该将数据拆分为两个表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