我有以下 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/