从 mysql 表中获取所有第二高的值

Posted

技术标签:

【中文标题】从 mysql 表中获取所有第二高的值【英文标题】:get all second highest values from a mysql table 【发布时间】:2013-09-15 01:23:36 【问题描述】:

我有一个包含两个字段的表格,如下所示,

name    score
xyz      300
pqr      200
abc      300
mno      100
erp      200
yut      200

如何使用 mysql 查询从上表中检索所有第二高分。尝试如下,

SELECT name, MAX( `score` )
FROM score
WHERE score < (
SELECT MAX( score )
FROM score )

但它返回单个值。

预期结果,

name    score
pqr      200
erp      200
yut      200

请帮忙

【问题讨论】:

什么是“第二高”?如果有3 3 3 3 3 2 2 2 1 1 1 1 - 这里第二高的是什么? 您对上述数据的预期输出是什么? “预期结果”——如果有多个 300 值怎么办? 【参考方案1】:

你可以使用:

SELECT 
  `name`,
  `score`
FROM 
  `score`
WHERE 
  `score`=(SELECT DISTINCT `score` FROM `score` ORDER BY `score` DESC LIMIT 1,1)

提示:命名表和它的列同名会导致复杂查询的麻烦(对你来说,而不是对DBMS)

【讨论】:

限制不应该是 1,1 吗? @rakeshjain,是的。谢谢 @zerkms - 我认为第二高 valueES 意味着它应该是 3 3 for 3 3 1 呵呵,在我后面加了DISTINCT @AlmaDoMundo,您的查询将返回所有最高值。但我需要所有第二高的值。【参考方案2】:

在 sqlfiddle 上创建了一个示例,它根据您的异常输出显示。

http://sqlfiddle.com/#!2/ce7a1/1

SELECT name, score
FROM score
WHERE score = (SELECT MAX(score) FROM score WHERE score < (SELECT MAX(score) FROM score))

【讨论】:

这根本无法扩展。当我们需要第三个最高值时,该解决方案将如何扩展?第四高的值呢?第 n 高?【参考方案3】:

如果第二高分数和逗号分隔的第二高分数名称列表很好,可以使用如下所示的单个查询来完成

SELECT group_concat(name) as names,`score` FROM `score` group by `score` 
ORDER BY `score` DESC LIMIT 1,1

【讨论】:

【参考方案4】:

简单查询

SELECT name, score 
FROM score 
WHERE score=(SELECT DISTINCT score FROM score ORDER BY score DESC LIMIT 1,1)

【讨论】:

以上是关于从 mysql 表中获取所有第二高的值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL Server 表中提取第二高的产品使用率?

176. 第二高的薪水

Mysql略复杂命令总结

LeetCode176——第二高的薪水

mysql 第二高薪水

mysql--单表中筛选出第二高的薪水