【MySQL】ANY函数 的巧用(筛选字段 = ANY(语句))

力扣题

1、题目地址

1364. 顾客的可信联系人数量

2、模拟表

顾客表:Customers

Column Name Type
customer_id int
customer_name varchar
email varchar
  • customer_id 是这张表具有唯一值的列。
  • 此表的每一行包含了某在线商店顾客的姓名和电子邮件。

联系方式表:Contacts

Column Name Type
user_id id
contact_name varchar
contact_email varchar
  • (user_id, contact_email) 是这张表的主键(具有唯一值的列的组合)。
  • 此表的每一行表示编号为 user_id 的顾客的某位联系人的姓名和电子邮件。
  • 此表包含每位顾客的联系人信息,但顾客的联系人不一定存在于顾客表中。

发票表:Invoices

Column Name Type
invoice_id int
price int
user_id int
  • invoice_id 是这张表具有唯一值的列。
  • 此表的每一行分别表示编号为 user_id 的顾客拥有有一张编号为 invoice_id、价格为 price 的发票。

3、要求

为每张发票 invoice_id 编写一个查询方案以查找以下内容:

  • customer_name:与发票相关的顾客名称。
  • price:发票的价格。
  • contacts_cnt:该顾客的联系人数量
  • trusted_contacts_cnt:可信联系人的数量:既是该顾客的联系人又是商店顾客的联系人数量
    (即:可信联系人的电子邮件存在于 Customers 表中)。
  • 返回结果按照 invoice_id 排序。

结果的格式如下例所示。

示例 1:

输入:
Customers 表:

customer_id customer_name email
1 Alice alice@leetcode.com
2 Bob bob@leetcode.com
13 John john@leetcode.com
6 Alex alex@leetcode.com

Contacts 表:

user_id contact_name contact_email
1 Bob bob@leetcode.com
1 John john@leetcode.com
1 Jal jal@leetcode.com
2 Omar omar@leetcode.com
2 Meir meir@leetcode.com
6 Alice alice@leetcode.com

Invoices 表:

invoice_id price user_id
77 100 1
88 200 1
99 300 2
66 400 2
55 500 13
44 60 6

输出:

invoice_id customer_name price contacts_cnt trusted_contacts_cnt
44 Alex 60 1 1
55 John 500 0 0
66 Bob 400 2 0
77 Alice 100 3 2
88 Alice 200 3 2
99 Bob 300 2 0

解释:
Alice 有三位联系人,其中两位(Bob 和 John)是可信联系人。
Bob 有两位联系人, 他们中的任何一位都不是可信联系人。
Alex 只有一位联系人(Alice),并是一位可信联系人。
John 没有任何联系人。

4、代码编写

代码

SELECT one.invoice_id, 
       two.customer_name, 
       one.price, 
       COUNT(three.user_id) AS contacts_cnt, 
       IFNULL(SUM(three.contact_email = ANY(SELECT email FROM Customers)), 0) AS trusted_contacts_cnt
FROM Invoices one
    LEFT JOIN Customers two ON one.user_id = two.customer_id
    LEFT JOIN Contacts three on two.customer_id = three.user_id
GROUP BY one.invoice_id
ORDER BY one.invoice_id

代码分析

1、根据发票找到对应顾客名称

SELECT two.customer_name
FROM Invoices one
	LEFT JOIN Customers two ON one.user_id = two.customer_id

2、从输出结果看出得根据发票 invoice_id 分组且排序根据发票 invoice_id 顺序,取得 发票价格

SELECT one.invoice_id, 
	   one.price
FROM Invoices one
GROUP BY one.invoice_id
GROUP BY one.invoice_id

3、顾客的联系人数量(Customers 顾客表对应 Contacts 联系人表)(two.customer_id = three.user_id)

SELECT COUNT(three.user_id) AS contacts_cnt
FROM Invoices one
    LEFT JOIN Customers two ON one.user_id = two.customer_id
    LEFT JOIN Contacts three on two.customer_id = three.user_id
GROUP BY one.invoice_id
ORDER BY one.invoice_id

4、可信联系人的数量是顾客联系人又是商店顾客的联系人数量,那就说明 Contacts 的对应联系人的邮箱存在于 Customers 表中

SELECT IFNULL(SUM(three.contact_email = ANY(SELECT email FROM Customers)), 0) AS trusted_contacts_cnt
FROM Invoices one
    LEFT JOIN Customers two ON one.user_id = two.customer_id
    LEFT JOIN Contacts three on two.customer_id = three.user_id
GROUP BY one.invoice_id
ORDER BY one.invoice_id

知识点

语法:筛选字段 = ANY(语句)
作用:只要 筛选字段 满足等于 语句 中的某一个值就返回True

语法:SUM(条件表达式)
作用:条件表达式如果为True,则加1,默认0(类似Count函数)

参考

SQL Any运算符

相关推荐

  1. 【MySQL】ANY函数 筛选字段 = ANY(语句))

    2024-01-09 19:24:04       39 阅读
  2. C语言—scanf和printf 函数&字符

    2024-01-09 19:24:04       29 阅读
  3. 【MySQL】 DATE_SUB 函数判断时间是否连续

    2024-01-09 19:24:04       40 阅读
  4. SQL AND、OR 和 NOT 运算符:条件筛选高级

    2024-01-09 19:24:04       41 阅读
  5. map实现springbean命令模式

    2024-01-09 19:24:04       39 阅读
  6. count与count()

    2024-01-09 19:24:04       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-09 19:24:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-09 19:24:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-09 19:24:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-09 19:24:04       18 阅读

热门阅读

  1. 逆流而上-摘抄句子

    2024-01-09 19:24:04       36 阅读
  2. Git命令 本地-远程 简洁步骤

    2024-01-09 19:24:04       31 阅读
  3. React-路由进阶

    2024-01-09 19:24:04       33 阅读
  4. 智能寻迹避障清障机器人设计(摘 要)

    2024-01-09 19:24:04       40 阅读
  5. 布隆过滤器的原理

    2024-01-09 19:24:04       24 阅读
  6. 编程笔记 html5&css&js 025 HTML输入类型(1/2)

    2024-01-09 19:24:04       36 阅读
  7. Qt隐式共享浅析

    2024-01-09 19:24:04       34 阅读
  8. 【前端】JQuery(学习笔记)

    2024-01-09 19:24:04       32 阅读