反转选择查询的结果

时间:2012-06-25 00:10:39

标签: mysql select invert

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

--------------------
| 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是否存在“electronics”标签,否则插入该行。

  3. 还有另一种更有效的方法吗? (可能在同一张桌子上使用JOIN

4 个答案:

答案 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','%')

<强> view here from demo: SQLFiddle.com

答案 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

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

答案 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