3

データベースに 3 つのテーブルがあります。

製品

  • id (整数、主キー)
  • 名前 (varchar)

タグ

  • id (整数、主キー)
  • 名前 (varchar)

製品タグ

  • product_id (整数)
  • tag_id (整数)

指定された ID のタグが割り当てられた製品を選択する SQL クエリを実行しています。

SELECT * FROM Products
JOIN ProductTags ON Products.id = ProductTags.product_id
WHERE ProductTags.tag_id IN (1,2,3)
GROUP BY Products.id

指定された ID を持つタグが割り当てられていない製品を選択できます。

SELECT * FROM Products
JOIN ProductTags ON Products.id = ProductTags.product_id
WHERE ProductTags.tag_id NOT IN (4,5,6)
GROUP BY Products.id

そのクエリを組み合わせて、特定のタグを持ち、他のタグを持たない製品を選択するにはどうすればよいですか? 私はこれをそのように達成しようとしました:

SELECT * FROM Products
JOIN ProductTags ON Products.id = ProductTags.product_id
WHERE ProductTags.tag_id IN (1,2,3)
AND ProductTags.tag_id NOT IN (4,5,6)
GROUP BY Products.id

しかし、明らかに機能しておらず、タグ (4,5,6) が割り当てられているかどうかに関係なく、タグ (1,2,3) を持つ製品が表示されます。1 つのクエリを使用してこの問題を解決することは可能ですか?

4

1 に答える 1

4

サブクエリを使用して、不要なタグを含む製品のリストを除外します。

SELECT * FROM Products
  JOIN ProductTags ON Products.id = ProductTags.product_id
  WHERE ProductTags.tag_id IN (1,2,3)
    AND Products.id NOT IN (SELECT product_id FROM ProductTags WHERE tag_id IN (4,5,6))
  GROUP BY Products.id
于 2011-02-16T12:18:45.450 に答える