0

だから私はこれを行うための最良の方法は何かを判断しようとしています:私はこれをできるだけ簡単にしようとしますが、十分な情報を提供します

大規模なデータセットを持つデータベースがあります。この例では、各車は誰かが探している車です

私はテーブルを持っています:

CREATE TABLE cars (
`car_id` INT(10),
`car_name` VARCHAR(20)
)  

そしてオプションテーブルのような

CREATE TABLE `car_selected_options` (
`car_sel_id`   INT       NOT NULL AUTO_INCREMENT,
`car_id`       INT       //the id of the car record created
`value`        INT       //id of info in a ref table
`key`          VARCHAR(20)   //from the car_option_reference,
)

いくつかの例は次のとおりです。値は、参照テーブル内の詳細情報の ID です (2 つのエレクトロニクスに注意してください)。

car_id=1, value='10',    key='exterior_color'  10='red'
car_id=1, value='21',    key='interior_color'  21='blue' 
car_id=1, value='100',   key='electronics'     100='radio'
car_id=1, value='101',   key='electronics'     101='nav'

赤で、ナビとラジオがあるすべての車のIDを見つける必要があります。次のようなことをしています:

SELECT distinct(c.car_id)
FROM `car` c 
   INNER JOIN `car_selected_options` AS o ON c.car_id = o.car_id
WHERE 
o.car_sel_id IN 
        ( SELECT car_sel_id 
            FROM car_selected_options so 
            WHERE so.`key` = 'exterior_color' 
              AND so.value IN ('10' ) AND b.buyer_id = bm.buyer_id )
    AND
o.car_sel_id IN 
        ( SELECT car_sel_id 
            FROM car_selected_options so 
            WHERE so.`key` = 'electronics'  
              AND so.value IN ('100','101' ) AND b.buyer_id = bm.buyer_id )

または、キーとすべてを 1 つのテーブルに配置する代わりに、次のように、各 key.option ごとに個別のテーブルを使用する方がよいでしょうか。

car_exterior_color (could have one entry per car or multiples if this person is ok with a red or a blue colored car)
car_interior_color 
car_electronics

これらの複数のサブ選択を行う代わりに (多くの場合があります)、複数の内部結合を行いますか?

これが理にかなっていることを願っています

4

1 に答える 1

0

「b」および「bm」テーブルが何であるかがわからないため、投稿したクエリに何かが欠けているようです。その句を無視すると、複数の副選択を行わずにクエリを大幅に簡素化できます。

SELECT c.car_id
FROM `car` c 
   INNER JOIN `car_selected_options` AS o ON c.car_id = o.car_id
WHERE 
   (o.key = 'exterior_color' AND o.value = 10) OR
   (o.key = 'electronics' AND o.value = 100) OR
   (o.key = 'electronics' AND o.value = 101) OR
GROUP BY c.car_id
HAVING COUNT(*) = 3;

この場合の「3」は、適用する基準の数です。ここでのコツは、一致する車ごとに正確に 3 つの一致する行が必要であるため、car_id でグループ化し、count(*) = 3 でフィルター処理すると、すべての条件に一致する車のみが選択されることです。

于 2013-01-11T17:57:59.197 に答える