gpt4 book ai didi

mysql - 在 OR 运算中混合使用 WHERE 和 HAVING

转载 作者:行者123 更新时间:2023-11-29 01:54:51 26 4
gpt4 key购买 nike

我有以下数据库结构(为清楚起见删除了一些字段):

quotes
------
id
name

business_quotes
---------------
id
quote_id
business_id
status

对于 business_quotes 表中的 status 字段,可能的值是:

  • 0 - 报价未得到答复
  • 1 - 引用已回答
  • 2 - 已订购报价
  • 3 - 报价被拒绝

我想检索所有具有至少一个顺序的报价(status = 2),其中所有 相关的 business_quotes 记录被拒绝。我可以通过下面的查询得到一个或另一个。

获取所有有订单的报价:

SELECT quotes.* 
FROM quotes
INNER JOIN business_quotes
ON quotes.id = business_quotes.quote_id
WHERE business_quotes.status = 2
GROUP BY quotes.id

获取所有 quotes,其中所有 business_quotes 均被拒绝。

SELECT quotes.* 
FROM quotes
INNER JOIN business_quotes
ON quotes.id = business_quotes.quote_id
HAVING SUM(business_quotes.status) = COUNT(business_quotes.id) * 3

我不能做的是在一个查询中混合使用这两个条件。

在某些情况下,可以简单地将 WHERE 条件转换为 HAVING,如此答案中所述:https://stackoverflow.com/a/20900476/1128918 .但我不能遵循相同的逻辑,因为 status 列不在 select 语句中。

最佳答案

像这样的东西应该可以工作。选择中的聚合是可选的。本质上,您只是需要查询具有任何“2”状态或具有值“3”的所有状态的报价。

免责声明:未检查语法错误,我常用的 SQL 语言是 T-SQL,因此可能需要调整。

SELECT 
quotes.id,
quotes.name,
SUM(CASE WHEN business_quotes.status = 2 THEN 1 ELSE 0 END) as NumOrdered,
SUM(CASE WHEN business_quotes.status = 3 THEN 1 ELSE 0 END) as NumRefused
FROM
quotes
INNER JOIN business_quotes ON quotes.id = business_quotes.quote_id
GROUP BY
quotes.id,
quotes.name
HAVING
SUM(CASE WHEN business_quotes.status = 2 THEN 1 ELSE 0 END) > 0
OR
SUM(CASE WHEN business_quotes.status = 3 THEN 1 ELSE 0 END)
= COUNT(quotes.id)

关于mysql - 在 OR 运算中混合使用 WHERE 和 HAVING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32055836/

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