3つのテーブルに対処するMySQLクエリ:Aからの数はBまたはCにありませんか?
質問
次のタスクを実行するためにMySQLクエリを策定するのに問題がありますが、ここで説明している同様のクエリを見てきましたが、それらはそれらを転置しようとする私の試みをスヌーカーするのに十分に異なります。問題は、(かなり)簡単に述べることです。 「メンバー」、「dog_shareoffered」、「dog_sharewanted」の3つのテーブルがあります。メンバーは、販売したい、または購入したいものについてはゼロ、1つ以上の広告を持っている可能性があり、詳細は、広告を配置したメンバーのIDとともに、対応する提供されたまたは必要なテーブルに保存されます。列「ID」はメンバーに固有のものであり、3つのテーブルすべてに共通しています。私が望むクエリは、どちらのテーブルに広告を入れていないメンバーの数を尋ねることです。
私はこれを尋ねるいくつかの方法を試しました。私が得ることができる最も近いのは、クラッシュしない質問です! (私は決してMySQLの専門家ではありません)。以下は、他の例から収集したものからまとめましたが、ゼロ行を返します。そこでは、結果がゼロよりも大きいことがわかります。
SELECT id
FROM members
WHERE id IN (SELECT id
FROM dog_sharewanted
WHERE id IS NULL)
AND id IN (SELECT id
FROM dog_shareoffered
WHERE id IS NULL)
このクエリは、私が見た「Join's」とは異なり、快適に理解できるように見えますが、何らかの参加が必要だと思いますが、この場合はどのように見えますか?
解決
広告が必要ない場合 また テーブル、次に、次のようなクエリのようなクエリは次のとおりです。
SELECT id
FROM members
WHERE id NOT IN ( any id from any other table )
他のテーブルからIDを選択するには:
SELECT id
FROM <othertable>
したがって:
SELECT id
FROM members
WHERE id NOT IN (SELECT id FROM dog_shareoffered)
AND id NOT IN (SELECT id FROM dog_sharewanted)
1人のメンバーが多くの広告を入れることができるため、「Select Distiction」を追加しましたが、IDは1つだけです。 以前はありました SELECT DISTINCT
上記のサブQueriesでは、以下のコメントが言及しているように、これは必要ありません。
サブクエリを避けたい場合(パフォーマンスの増加の可能性によって異なります。)、左の結合を使用できます。
SELECT members.id
FROM members
LEFT JOIN dog_shareoffered
ON dog_shareoffered.id = members.id
LEFT JOIN dog_sharewanted
ON dog_sharewanted.id = members.id
WHERE dog_shareoffered.id IS NULL
AND dog_sharewanted.id IS NULL
なぜこれが機能するのか:
テーブルを取ります members
そして、それを他の2つのテーブルに結合します id
桁。 LEFT JOIN
メンバーがに存在する場合を意味します members
テーブルですが いいえ 私たちが参加しているテーブル(例: dog_shareoffered
)、対応する dog_shareoffered
列にはあります NULL
それらの中に。
だから、 WHERE
条件は、aがある行を選択します NULL
両方のID dog_shareoffered
と dog_sharewanted
, 、つまり、IDを見つけました members
他の2つのテーブルに対応するIDはありません。