lintcode-1918 · 第二高的球员的身高

762 阅读2分钟

描述

编写一个 SQL 语句,获取球员 (players) 表中第二高的身高 (height)

表定义: players (球员表)

列名类型注释
idint unsigned主键
heightint球员身高

**

注意输出结果的列名为:second_height

样例

样例一:

表内容: players

idheight
1198
2226
3200
4226

如上述球员 (players) 表,SQL 查询应该返回 200 作为第二高的身高。如果不存在第二高的身高,那么查询应该返回 null

second_height
200

样例二:

表内容: players

idheight
1198
2198
3198

如上述球员 (players) 表,SQL 查询应该返回 null

second_height
null

题解

解法1

首先找到身高最大值,然后再根据身高最大值,找到身高第二大的值。

使用max函数,先找到最大值,然后挑选出所有小于最大值的数,再次使用max找到第二大的值。

select max(height) as second_height from players
where height < (select max(p1.height) from players p1);

这个使用了not in (!=)找到其他的高度值,然后在剩下的高度值中,找到第二大的高度值。

select max(height) second_height from players where height not in (select max(height) from players );

解法2

这个解法主要是分页的思想,首先按照身高之进行排序,然后使用limit和offset找到第二个。



select (select distinct height second_height from players
order by height desc 
limit 1 
offset 1) as second_height 

解法3

IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。

IFNULL() 函数语法格式为:

select ifnull((
    select distinct height from players order by height desc limit 1,1),null)
    as second_height;