2012-01-26 4 views
2

私は、何らかの種類の特別なキー、分析や物事に使われる値を持つ製品テーブルを持っています。私の問題は、指定されたキーで製品を見つけるのが簡単な場合は、を見つけて、キーを見つけない方がずっと難しいということです。話を切り、コードを見せましょう。関連するキーのない要素を見つける

SELECT products.* 
    FROM products 
    JOIN metas ON products.id = metas.product_id 
    WHERE 
     metas.key = 'mykey' AND 
     metas.value = '1' 

私が指定した値1(下の例では1)に設定mykeyというキーを持つすべての製品を取得します。

ここでは、キーのマイキー(以下の例では2)が設定されていないすべての製品を取得したいと考えています。キーが設定されていない場合は、メタテーブルに要素が存在しません。

+-------------+  +----------------------------+ 
| products |  | metas      | 
+=============+  +============+=======+=======+ 
|id   |  | product_id | key | value | 
+-------------+  +------------+-------+-------+ 
| 1   |  | 1   | mykey | 1  | 
| 2   |  | 1   | foo | bar | 
+-------------+  +------------+-------+-------+ 

サブステップがない場合は追加ポイントselectが処理中に傷ついています。

答えて

3

NOT EXISTSを使用することもできます。

+1

余分な 'SELECT'がなければ、それは本当に可能ではありません。ありがとう。 – greut

0

私はあなたが後にしているものを理解していれば、同様にNULLをLEFT JOINとテストを使用します。

SELECT products.* 
FROM products 
LEFT JOIN metas ON products.id = metas.product_id 
WHERE 
    (metas.key = 'mykey' AND metas.value = '1') 
    OR mets.key IS NULL 

あなたが質問から同時にこれらの条件の両方が(はっきりしないしたくない場合)、WHERE句の最初の部分を削除し、NULLのみをテストします。

SELECT products.* 
FROM products 
LEFT JOIN metas ON products.id = metas.product_id 
WHERE 
    metas.key IS NULL 
+0

問題は、(あなたが質問で分かるように)その行はメタテーブルに存在しないため、参加することがないため(「left」を使用しても)参加しません。私が推測するところでは、非副選択は不可能でした。 – greut

+0

@greutこれは、左の結合のためのものです。右側の表に一致(NULL)がなくても、左側の表に行が戻されます。それを試しましたか? –

+0

事は私が気にしない他のキーです。 – greut

関連する問題