我有一个名为“products”的表,其中包含以下数据。
--------------------
| id | tag_name |
--------------------
| 1 | electronics |
| 1 | tv |
| 1 | lcd |
| 2 | tv |
| 2 | lcd |
| 3 | tv |
| 3 | lcd |
--------------------
所有产品必须具有“电子”标签,但很少有产品缺少该标签。基于我的问题上面的数据,我运行什么查询,以便它将返回ids 2& 3因为他们没有'电子'标签。
想到2个解决方案
使用NOT IN - select distinct id from products where id not in (select id from products where tag_name='electronics')
- 行数百万,效率非常低
第二个解决方案是拼凑一个选择所有不同ID的脚本,然后检查该id是否存在“electronics”标签,否则插入该行。
还有另一种更有效的方法吗? (可能在同一张桌子上使用JOIN
)
答案 0 :(得分: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
,请使用zerkms的solution。
答案 1 :(得分:2)
JOIN
不适用于您的案例,因为并非所有id
都有electronics
tag_name 。
试试看:
SELECT DISTINCT id
FROM Products
GROUP BY id
HAVING not GROUP_CONCAT(tag_name) like CONCAT('%','electronics','%')
答案 2 :(得分: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
答案 3 :(得分: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