2016-12-12 4 views
0

次の構造を使用して、この1:nの関係で複数の条件を考慮してrequestのサブセットを選択するにはどうすればよいですか?表2のための左の結合で複数の値を選択

# Table 1: Request 
uid 
name 

# Table 2: Additional Information 
uid 
type 
value 
request 

注:typeは何でも、すなわち 'PRODUCT_NAME' または '評価' にすることができます。

私はちょうど私がこれを行うことができます与えられたproduct_nameで要求を選択したいと思います場合:

SELECT * FROM request as r 
    LEFT JOIN additional_information as i 
    ON r.uid = i.request 
    WHERE i.type = 'product' AND i.value = 'Product Name' 

私は与えられたproduct_nameで要求を選択したい場合は、私の文は次のように見なければならない何にこだわっていますAND rating。私は単に別の参加を追加しようとしましたが、これは与えられた評価に関連するすべてのリクエストと同様に、product_nameに関連するすべてのリクエストを私に与えました。両方の条件を尊重する声明が必要です。

これは、前述したように、私にとっては機能しません。

SELECT * FROM request as r 
    LEFT JOIN additional_information as i 
    ON r.uid = i.request 
    LEFT JOIN additional_information as a 
    ON r.uid = a.request 
    WHERE i.type = 'product' AND i.value = 'Product Name' 
    OR a.type = 'rating' AND a.value = 1 

ヘルプを評価してください!

答えて

1
は、あなたが実際に列を指定したい場合があります select r.*

SELECT * FROM request as r 
    LEFT JOIN additional_information as i 
    ON r.uid = i.request 
    AND i.type = 'product' AND i.value = 'Product Name'  
    LEFT JOIN additional_information as a 
    ON r.uid = a.request 
    AND a.type = 'rating' AND a.value = 1; 

ようWHEREからJOIN ON条件にそれらの条件を移動して、はい、絶対に、Strwaberyから(見逃し)貴重なコメントを考慮すると、代わりにselect *を行うのか、

あなたが投げたい名前は*よりも優れています。これは投射を使って不必要なデータを取得していないためです。あなたが本当にすべてを取得しない限り。

+2

@TheF実際に返される列の名前を指定します。 – Strawberry

+0

これは動作しますが、クエリは非常に遅く、50万未満のレコードで作業しています。クエリを最適化する方法はありますか? –

+0

@ TheFは、テーブルの索引付けの程度によって異なります。あなたのテーブルの完全な定義をこの提案されたクエリと共に計画を説明してください。 – Rahul

0

追加データのTWICEへの参加が遅れている可能性があります.2回は製品用、もう1回は評価用です。これはおそらく単一の左結合に変更する必要があります。そうしないと、答えが膨らんでデカルトの結果が得られます。

SELECT * 
    FROM 
     request as r 
     LEFT JOIN additional_information as i 
      ON r.uid = i.request 
      AND ( (i.type = 'product' AND i.value = 'Product Name') 
       OR (i.type = 'rating' AND i.value = 1); 
関連する問題