2012-04-09 7 views
3

私はこの問題にぶつかりました。 私の卓上グループは "制限とオフセット"のためにのみ、MySQLで

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 

私は、データを2つのグループで、そのように表示があります。

-Fiat - Punto 
     Panda 

-Ford - Mondeo 
     Mustang 

だから、2つのブランドが、4件のデータベースの結果があります。 クエリの制限を設け、結果を2つのブランドにオフセットすることは可能ですか?ブランドのすべてのモデルを表示しますか?

申し訳ありませんが、私は明確ではない!

答えて

3

明らかです。これを試してみてください:

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

前にを注文してください。

+0

完全に論理的ですが、私はMySQLを使用してこの問題を抱えています:#1235 - このバージョンのMySQLはまだ 'LIMIT&IN/ALL/ANY/SOMEサブクエリ'をサポートしていません。 – penpen

+0

これは派生テーブルで、 in/all/any/some'と入力します。これは私のものではないAlpのソリューションに起こります:) [実際の例](http://sqlfiddle.com/#!2/4721f/2)とにかく、あなたはどのバージョンを使用していますか? –

+1

+1 nice solution – Alp

0

これはデータベース設計の問題です。データを2つのテーブル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の必要はありません。

+0

完全に論理が、私は、MySQLを使用して、この問題を取得しています:#1235 - のMySQLのこのバージョンはまだALL/ANY「LIMIT&IN /をサポートしていません。/SOMEサブクエリ ' – penpen

+0

これで私の答えは間違っているかもしれません。代わりに[Mosty Mostachoの解決策](http://stackoverflow.com/a/10080818/675065)を試してください。 – Alp

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''のケースでは、< 'Ford'のアルファベット順のブランドが3つありますので、count(*) = 3以上です.3が2以上であるため、出力に'Ford'車が表示されません。

テストデータの出力は次のようになります。今

CARBRAND CARMODEL 
Alfa Romeo Guilietta 
Alfa Romeo Mito 
Audi  A3 
Audi  R8 
Audi  TT 

、あなたは2つのブランドを選択したいか言ってませんでした - あなたは自分の例では、フォードとフィアットが記載されている - Iドンあなたがそれらをどうやって選んだのか分かりません。注文のためのアルファベット順の基準以外のものが必要な場合、それは実行可能ですが、より困難です。

SQLフィドルとこのすべての結果:http://sqlfiddle.com/#!2/33a8f/3

関連する問題