【MySQL】GROUP BY 后用 HAVING 进行筛选(筛选使用 SUM(条件表达式) 的语法,且不加比较符的写法)

力扣题

1、题目地址

1398. 购买了产品 A 和产品 B 却没有购买产品 C 的顾客

2、模拟表

Customers 表:

Column NameType
customer_idint
customer_namevarchar
  • customer_id 是这张表中具有唯一值的列。
  • customer_name 是顾客的名称。

Orders 表:

Column NameType
order_idint
customer_idint
product_namevarchar
  • order_id 是这张表中具有唯一值的列。
  • customer_id 是购买了名为 “product_name” 产品顾客的id。

3、要求

  • 请你编写解决方案,报告购买了产品 “A”,“B” 但没有购买产品 “C” 的客户的 customer_id 和 customer_name,
    因为我们想推荐他们购买这样的产品。
  • 返回按 customer_id 排序 的结果表。

4、示例

输入:

Customers 表:

customer_idcustomer_name
1Daniel
2Diana
3Elizabeth
4Jhon

Orders 表:

order_idcustomer_idproduct_name
101A
201B
301D
401C
502A
603A
703B
803D
904C

输出:

customer_idcustomer_name
3Elizabeth

解释:

只有 customer_id 为 3 的顾客购买了产品 A 和产品 B ,却没有购买产品 C 。

5、代码编写

我的写法

SELECT DISTINCT a.customer_id, d.customer_name
FROM Orders a, Orders b, Orders c, Customers d
WHERE a.customer_id = b.customer_id
AND b.customer_id = c.customer_id
AND a.product_name = 'A'
AND b.product_name = 'B'
AND a.customer_id = d.customer_id
AND NOT EXISTS(SELECT * FROM Orders WHERE customer_id = c.customer_id AND product_name = 'C')

网友写法一(HAVING 加 SUM(条件表达式) ,加比较符的写法)

SELECT o.customer_id, customer_name
FROM orders o, customers c
WHERE o.customer_id = c.customer_id
GROUP BY o.customer_id
HAVING SUM(product_name = 'A') > 0 AND SUM(product_name = 'B') > 0 AND SUM(product_name = 'C') = 0

网友写法二(HAVING 加 SUM(条件表达式) ,不加比较符的写法)

SELECT c.customer_id, customer_name
FROM customers c 
	JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id
HAVING SUM(product_name = 'A') AND SUM(product_name = 'B') AND NOT SUM(product_name = 'C')

代码分析

从以上两种写法可以看出在 HAVING 中,

1、SUM(条件表达式) 如果是大于0,可以省略
SUM(product_name = 'A') > 0 AND SUM(product_name = 'B') > 0SUM(product_name = 'A') AND SUM(product_name = 'B')

2、SUM(条件表达式) 如果是等于0,则在加前面加 NOT,后面可以省略
SUM(product_name = 'C') = 0NOT SUM(product_name = 'C')

  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值