0

次のデータを含む「製品」というテーブルがあります。

--------------------
| id | tag_name    |
--------------------
| 1  | electronics |
| 1  | tv          | 
| 1  | lcd         |
| 2  | tv          | 
| 2  | lcd         |
| 3  | tv          |
| 3  | lcd         |
--------------------

すべての製品に「電子機器」タグを付けることが義務付けられていますが、そのタグが欠落している製品はほとんどありません。私の質問の上のデータに基づいて、「電子機器」タグがないため、ID 2 と 3 を返すように実行するクエリはどれですか。

頭に浮かぶ2つの解決策は

  1. NOT IN を使用する - select distinct id from products where id not in (select id from products where tag_name='electronics')- 数百万行の場合、これは非常に非効率的です

  2. 2番目の解決策は、すべての個別のIDを選択し、そのIDに「electronics」タグが存在するかどうかをチェックし、存在しない場合は行を挿入するスクリプトを作成することです。

これを処理する別のより効率的な方法はありますか? (JOIN同じテーブルで を使用している可能性があります)

4

4 に答える 4

2
INSERT INTO products 
SELECT a.id, 'electronics'
FROM products a
LEFT JOIN products b ON a.id = b.id AND b.tag_name = 'electronics'
WHERE b.id IS NULL
GROUP BY a.id

これにより、実際にproductsテーブルが更新され、「電子機器」タグを持っていないすべての製品にタグが付けられます。

http://sqlfiddle.com/#!3/f312a/1/0

ただし、特定のタグを持たないのみを選択したい場合は、zerkms のソリューションを使用してください。id

于 2012-06-25T00:22:24.693 に答える
2

JOINidすべての s にelectronics tag_nameがあるわけではないため、あなたのケースでは機能しません。

これを試してみてください:

  SELECT DISTINCT id
    FROM Products
GROUP BY id
  HAVING not GROUP_CONCAT(tag_name) like CONCAT('%','electronics','%')

デモからここを見る:SQLFiddle.com

于 2012-06-25T00:44:21.760 に答える
1
SELECT DISTINCT t1.id
FROM products t1
LEFT JOIN products t2 ON t2.tag_name = 'electronics' AND t1.id = t2.id
WHERE t2.id IS NULL

http://sqlfiddle.com/#!2/8d805/2

于 2012-06-25T00:20:17.883 に答える
0

このようなものはどうですか、ローカルで試してみたところ、うまくいくように見えました

SELECT DISTINCT p1.id 
    FROM products p1 
    LEFT JOIN products p2 ON p1.id = p2.id AND p1.tag_name != p2.tag_name 
WHERE p1.tag_name != 'electronics' and p2.id IS NULL
于 2012-06-25T00:19:30.723 に答える