0

次の問題があります。車の在庫を含むテーブルがあるとします。

VIN, MAKE, MODEL, PRICE

そして、さまざまな車のクラス (コンパクト、ミッドサイズ、SUV など) を含む別のテーブルがあります。

MAKE, MODEL, CLASS
JEEP, NULL , SUV
FORD, EXPLORER, SUV
TOYOTA, YARIS, COMPACT
NULL, CUBE, COMPACT
...

特定のクラスのデータベースですべての車を選択するにはどうすればよいですか? おそらく、各クラスの車が何台あるか知りたいですか?

このようなクエリを書くことができます。

SELECT COUNT(*) FROM CARS WHERE (MAKE, MODEL) IN (SELECT MAKE, MODEL FROM CLASSES WHERE CLASS = 'SUV')

ここでの問題は、データ内の NULL を実際に処理できないことです。言いたいのは、JEEPの全モデルがSUVであり、CUBEと呼ばれるすべてのMAKE車はコンパクトカーであるということです.

競合がないと仮定して、これを行うことができますか? 次のようにして、SUV であるカイエンを除いて、すべてのポルシェが車であるように、優先順位を設定できますか。

MAKE, MODEL, CLASS
PORCHE, NULL , CAR
PORCHE, CAYENNE, SUV

これが MySQL で不可能な場合、これに適したより優れた DB テクノロジはありますか。CLASSES テーブルには 50K+ 行が含まれ、CARS テーブルには 5M+ 行が含まれると仮定します。データベースでこのようなクエリを実行する高速な方法を探していますが、スクリプトで処理するために何百万もの行を取得する必要はありませんか? また、メーカーとモデルだけでなく、サブモデル、エンジンなども含まれているとしたら..

また、データをかなり単純化しました。4 レベルの階層があります。

4

3 に答える 3

1

特定のクラスで make と model の両方を指定することはできないと仮定しますnullifnull()MySQL で関数を使用できます。

select cl.class, count(*)
from cars c inner join class cl
   on c.make = ifnull(cl.make,c.make)
   and c.model=ifnull(cl.model,c.model)
group by cl.class

アクセスを高速化するために、列makesにインデックスを追加することをお勧めします。model(上記classesのように)内部結合を使用して行数を減らすと、返される行数が制限されます。

于 2012-09-24T22:50:58.750 に答える
1

次のようにクエリを記述できます。

SELECT COUNT(*)
FROM CARS c join
     classes cl
     on (c.make = cl.make or cl.make is null) and
        (c.model = cl.model or cl.model is null) and
        cl.class = 'SUV'

問題は、重複する可能性があることです。したがって、より良いカウントは次のように始まります。

select count(distinct c.vin)
. . .

これは、JEEP と CUBE の 2 つのケースで機能するはずです。

于 2012-09-24T21:40:53.610 に答える
0

SELECT s.class、COUNT(*)FROM car c、car_class s WHERE c.make = s.make AND c.model = s.model GROUP BY s.class

あなたに次のようなものを与える必要があります

SUV14コンパクト32トラック11など

于 2012-09-24T21:58:50.023 に答える