0

我有一个名为“产品”的表,其中包含以下数据。

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

所有产品都必须有一个“电子”标签,但很少有产品缺少该标签。根据我的问题上面的数据,我运行什么查询以便返回 ids 2 和 3,因为它们没有“电子”标签。

想到的2个解决方案是

  1. 使用 NOT IN - select distinct id from products where id not in (select id from products where tag_name='electronics')- 有几百万行,这是非常低效的

  2. 第二种解决方案是拼凑一个脚本,该脚本选择所有不同的 ID,然后检查该 ID 是否存在“电子”标签,如果不存在则插入该行。

还有另一种更有效的方法来处理这个问题吗?(可能JOIN在同一张桌子上使用 a)

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

但是,如果您只想选择id没有特定标签的s,请使用 zerkms 的解决方案

于 2012-06-25T00:22:24.693 回答
2

JOIN不适用于您的情况,因为并非所有ids 都有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 回答