mysql - 如何选择相反(或不在)的一组结果?

标签 mysql sql select join

我有以下 MySQL 查询:

SELECT dgc.name, dgc.id, dgc.has_special 
FROM keyword k 
JOIN d_gift_card dgc ON k.gc_id = dgc.id 
WHERE keyword IN ('red') 
GROUP BY k.gc_id 
HAVING COUNT(DISTINCT k.keyword) = 1

它返回给我一个唯一id列表,其中附加了关键字“red”。

我想做的是获取一个没有附加关键字“red”的唯一id列表它。基本上与查询正在执行的操作相反。

我已经使用 NOT IN 尝试过此查询,但它返回了所有结果,包括与它们关联的“红色”结果。正确的方法是什么?

SELECT dgc.name, dgc.id, dgc.has_special 
FROM keyword k 
JOIN d_gift_card dgc ON k.gc_id = dgc.id 
WHERE keyword NOT IN ('red') 
GROUP BY k.gc_id 

最佳答案

我只需将条件移至 having 子句即可实现此目的:

SELECT dgc.name, dgc.id, dgc.has_special 
FROM keyword k JOIN
     d_gift_card dgc
     ON k.gc_id = dgc.id 
GROUP BY dgc.name, dgc.id, dgc.has_special  
HAVING SUM( keyword IN ('red') ) = 0;

请注意,GROUP BY 子句与未聚合的 SELECT 列相匹配。这是最佳实践,并且在大多数情况下是 SQL 标准所要求的。

HAVING 子句中的表达式计算'red' 的行数。 = 0 表示没有。

编写查询的最有效方法可能是:

SELECT dgc.name, dgc.id, dgc.has_special 
FROM d_gift_card dgc
WHERE NOT EXISTS (SELECT 1
                  FROM keyword k         
                  WHERE k.gc_id = dgc.id AND k.keyword IN ('red')
                 );

这可以利用keyword(gc_id, keywords)上的索引,并且根本不需要任何聚合。

关于mysql - 如何选择相反(或不在)的一组结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50205478/

相关文章:

mysql - “INSERT IGNORE” 和 “… ON DUPLICATE KEY UPDATE” 都会发生什么?

jQuery 选择/取消选择所有同级

mysql配置停在 "starting server"

mysql - 如何查找上次输入的记录

mysql - 查找表中的重复行

php - 如果在其他表中找不到匹配记录,如何从一个表中选择记录

php - Mysql - PHP - 查看总和列

mysql - 在 MySQL 分区表上选择未选择正确的分区

HTML, CSS |选择先前删除的箭头显示

mysql - 如何同时使用 MYSQL Group By 和 Order By