mysql - 从多个列中获取两个最大值

标签 mysql sql

我们可以使用GREATEST从下面的多个列中获得最大值(value)

SELECT GREATEST(mark1,mark2,mark3,mark4,mark5) AS best_mark FROM marks

但现在我想从所有 (5) 个分数中获得两个最好的分数。

我可以在 mysql 查询上执行此操作吗?

表结构(我知道是错的——别人创建的):

student_id  | Name | mark1 | mark2 | mark3 | mark4 | mark5

最佳答案

这不是最优雅的解决方案,但如果您无法更改表结构,则可以反透视 数据,然后应用用户定义的变量来获取每个 student_id 的行号。代码将类似于以下内容:

select student_id, name, col, data
from
(
  SELECT student_id, name, col,
    data,
    @rn:=case when student_id = @prev then @rn else 0 end +1 rn,
    @prev:=student_id
  FROM 
  (
    SELECT student_id, name, col,
      @rn, 
      @prev,
      CASE s.col
        WHEN 'mark1' THEN mark1
        WHEN 'mark2' THEN mark2
        WHEN 'mark3' THEN mark3
        WHEN 'mark4' THEN mark4
        WHEN 'mark5' THEN mark5
      END AS DATA
    FROM marks
    CROSS JOIN 
    (
      SELECT 'mark1' AS col UNION ALL 
      SELECT 'mark2' UNION ALL 
      SELECT 'mark3' UNION ALL 
      SELECT 'mark4' UNION ALL 
      SELECT 'mark5'
    ) s
    cross join (select @rn := 0, @prev:=0) c
  ) s
  order by student_id, data desc
) d
where rn <= 2
order by student_id, data desc;

参见 SQL Fiddle with Demo .这将返回每个 student_id 的前 2 个分数。内部子查询执行与使用 UNION ALL 取消透视类似的功能,但您不会多次查询表以获得结果。

关于mysql - 从多个列中获取两个最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16668698/

相关文章:

php - Phalcon hasManyToMany 停止添加与数据库的关系

java - SQL 异常 : Too many database connection

SQL 选择查询 - 两个表

sql - 如何将SQL DB下载到iOS的Core Data中

sql - 我可以在 ASP.net MVC 中使用纯 SQL 吗?

c# - 使用 SQL DataReader 捕获插入或删除的值

mysql - 连接两个 SQL 表

mysql - 如何清理 tikiwiki 中的表index_5*

php - 在用户未登录然后登录的情况下,将重复数据放入购物车很困难

php - 如果我只使用 PHP 文件而不与数据库相关,那么我可以在 XAMPP 中停止 MySql 服务吗?