2

次のタスクを実行するためのMySQLクエリの作成に問題があります。ここで説明した同様のクエリを見たことがありますが、これらはこのクエリとは十分に異なり、転置しようとする試みをスヌーカーします。問題は(かなり)簡単に述べることができます。'members'、'dog_shareoffered'、'dog_sharewanted'の3つのテーブルがあります。メンバーは、売りたいものや買いたいものについて0、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」とは異なり、理解しやすいように見えますが、何らかの結合が必要なのではないかと推測していますが、この場合はどのようになりますか?

4

1 に答える 1

6

どちらのテーブルにも広告を表示したくない場合は、次のようなクエリを実行します。

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 DISTINCT」を追加しましたが、IDは1つだけです。以前はSELECT DISTINCT上記のサブクエリにaが含まれていましたが、以下のコメントにあるように、これは必要ありません。

サブクエリを回避したい場合(場合によってはパフォーマンスが向上する可能性があります)、いくつかの左結合を使用できます。

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れます。

したがって、条件はとの両方にIDWHEREがある行を選択します。これは、他の2つのテーブルに対応するIDがないIDが見つかったことを意味します。NULLdog_shareoffereddog_sharewantedmembers

于 2012-02-20T01:22:30.090 に答える