3つのテーブルに対処するMySQLクエリ:Aからの数はBまたはCにありませんか?

StackOverflow https://stackoverflow.com/questions/9355066

  •  28-10-2019
  •  | 
  •  

質問

次のタスクを実行するために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_shareoffereddog_sharewanted, 、つまり、IDを見つけました members 他の2つのテーブルに対応するIDはありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top