【问题标题】:get all second highest values from a mysql table从 mysql 表中获取所有第二高的值
【发布时间】: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 值怎么办?

标签: mysql


【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2013-10-31
      • 2011-07-18
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      相关资源
      最近更新 更多