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