自学内容网 自学内容网

[高频SQL50题(基础版)]第五百八十四题,寻找用户推荐人

题目:

表: Customer

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| name        | varchar |
| referee_id  | int     |
+-------------+---------+
在 SQL 中,id 是该表的主键列。
该表的每一行表示一个客户的 id、姓名以及推荐他们的客户的 id。

找出那些 没有被 id = 2 的客户 推荐 的客户的姓名。

以 任意顺序 返回结果表。

结果格式如下所示。

示例 1:

输入: 
Customer 表:
+----+------+------------+
| id | name | referee_id |
+----+------+------------+
| 1  | Will | null       |
| 2  | Jane | null       |
| 3  | Alex | 2          |
| 4  | Bill | null       |
| 5  | Zack | 1          |
| 6  | Mark | 2          |
+----+------+------------+
输出:
+------+
| name |
+------+
| Will |
| Jane |
| Bill |
| Zack |
+------+

 这道题有很大的难度,因为要考虑SQL优化,只想简单的语句是会超出时间限制的,因为referee_id可能会很复杂

我的思路首先想到:

SELECT c.name
FROM Customer AS c
WHERE c.referee_id != 2

但是问题在于,没考虑到referee_id=null的情况,因为sql不同于java,当为null时只判断2是不可以的,所以加上下面的语句

SELECT c.name
FROM Customer AS c
WHERE c.referee_id != 2 OR c.referee_id IS NULL

这里虽然逻辑是对的,但是会超出时间限制,所以还是要优化sql修改代码

SELECT name
FROM Customer
WHERE referee_id != 2 OR referee_id IS NULL

 这里虽然通过了,但是时间太长了

我们看一下前面时间少的答案是怎么做的

# Write your MySQL query statement below
select name from Customer
where ifnull(referee_id, '') <> '2'

 

  1. IFNULL(referee_id, ''):
    • IFNULL 函数接受两个参数。如果第一个参数不是 NULL,它返回第一个参数的值;如果是 NULL,则返回第二个参数的值。
    • 在这里,如果 referee_id 是 NULL,函数将返回空字符串 ''
  2. <> '2':
    • 这部分比较 IFNULL 函数的结果是否不等于字符串 '2'

原文地址:https://blog.csdn.net/weixin_45201305/article/details/140317401

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!