gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:15:16 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com