从 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 表中获取所有第二高的值的主要内容,如果未能解决你的问题,请参考以下文章