Leetcode题解之database(十四)584.寻找用户推荐人 - 你应该知道的五种MySQL解法

28 篇文章 12 订阅
18 篇文章 7 订阅

题目链接:584.寻找用户推荐人

解题思路

此题思路其实很简单:只需要在条件查询中筛选推荐人编号都不是2的用户就能返回正确答案。
但是这里有一个坑大家要注意

  • customer表中referee_id列是包含NULL值的,这就暗示我们不能简单的写一句WHERE referee_id <> 2(如果你像前面这么写条件查询语句就会华丽丽的报错❌)
    • 好奇的小伙伴肯定想问为什么不能这么写?因为当要查询的条件字段包含NULL值时,如果直接用不等于(即<>!=)的比较运算符,结果是会排除NULL值所在行数据。
    • 也就是说,如果你写下面这个查询语句,它只会返回推荐人编号为1的用户名(即Zack),其余的都会被排除。
      SELECT name FROM customer WHERE referee_id <> 2;
      

理解了上面这个点,下面就讲讲此题的五种MySQL解法。

参考解法一:WHERE + OR 多个条件筛选

解题思路:

第一种解法是最简单易懂的,我们只需要在WHERE条件筛选语句后面再添加一个OR条件语句,即所有编号为NULL的也符合。
注意:这里要用IS NULL;不能用=NULL!!!不能用=NULL!!!不能用=NULL!!!(重要的事情说三遍)

  • 为什么不能用=NULL
    • 第一:因为MySQL官方文档中写道如果要搜索包含NULL的列值,使用“某一列=NULL”是不会返回任何行数据的,因为这个表达式不为True(真);
    • 第二:与NULL的任何算术比较结果也是 NULL,所以是无法从此类比较中获得任何有意义的结果。

解法一只要搞清楚这个点就很简单。

参考代码:
# Write your MySQL query statement below
SELECT name FROM customer WHERE referee_id <> 2 OR referee_id IS NULL;

参考解法二:比较函数COALESCE()

解题思路:

第二种解法则是利用COALESCE()比较函数。先回顾一下COALESECE()比较函数的基本用法

  • COALESCE(value,…)
  • 它会返回列表中的第一个非 NULL 值,如果没有非 NULL值则返回NULL

因为有些行的推荐人编号是NULL值,所以根据COALESCE()用法,可以把这些编号NULL值替换为0;再用0和2进行比较判断(它是否等于2)。由于0肯定是不等于2的,那么条件为True,则返回客户名;否则为False,不返回客户名。

参考代码:
# Write your MySQL query statement below
SELECT name FROM customer WHERE COALESCE(referee_id,0) <> 2;

参考解法三:IFNULL()函数

刚刚第二个解法可能大家平时不容易想到,那么专门用来判断某个值是否为NULL的IFNULL()函数相对来说更好理解,也是此题最有效的解法

解题思路

同样也是利用一个替换的思维,先通过IFNULL()的两个条件表达式把推荐人编号是NULL值的替换为0,再用0和2进行比较。

参考代码:
# Write your MySQL query statement below
SELECT name FROM customer WHERE IFNULL(referee_id,0) <> 2;

参考解法四:NOT IN + 子查询

解题思路

既然题目要找推荐人编号都不是2的客户,那么我们可以反向思维,先利用子查询找到所有编号为2的客户,再用NOT IN就能找到都不是2的客户名。

参考代码:
# Write your MySQL query statement below
SELECT name FROM customer WHERE id NOT IN (SELECT id FROM customer WHERE referee_id = 2);

参考解法五:NOT + <=>(即安全等于运算符)

解题思路

先简单介绍一下安全等于运算符<=>

  • 此运算符执行与 = 运算符类似的相等比较,如果两个数均为 NULL,则返回1;如果一个数为 NULL,另一个比较数是有意义的数字(比如1、2、3等),则返回0。

可以看出 <=>能用来对NULL值进行判断,那么回到这道题。当条件语句是referee_id <=> 2,找到的是编号都是2的客户,不符合题意,所以还要在前面加一个NOT。

参考代码:
# Write your MySQL query statement below
SELECT name FROM customer WHERE NOT referee_id <=> 2;

以上五种解法,推荐第一种和第三种,一个易懂,一个高效。其余三种可以了解,不要求掌握,当作思路的拓展。

今天的题解就到这里,如果对各位有帮助,麻烦大家一键三连,谢谢。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值