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

2024-01-09 17:37:23

力扣题

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 排序 的结果表。

返回结果格式如下所示。

示例 1:

输入:
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 。

4、代码编写

我的写法

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')

文章来源:https://blog.csdn.net/weixin_50223520/article/details/135484454
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。