Mysql查询比较不同列中的记录并找到最大的数字

时间:2015-05-23 17:03:52

标签: mysql

您好我想针对以下情况获得正确的查询:

user_id  english   physics    geography   chemistry

  1        75        60          85          79

我想要一个mysql查询来比较结果并返回主题名称/列,他已经获得了最高的数字。

所以在这里我们看到用户一个地理位置最高。我想用mysql查询获得这个列名(地理)。

这是小提琴链接:table

2 个答案:

答案 0 :(得分:1)

您可以尝试使用MySQL函数GREATEST()FIELD()ELT()来获取值:

SELECT user_id,
    GREATEST(english, physics, geography, chemistry) AS points,
    ELT(
      FIELD(
        GREATEST(english, physics, geography, chemistry),
        english, physics, geography, chemistry
      ),
      'english', 'physics', 'geography', 'chemistry'
    ) AS class
FROM results;

如何运作

GREATEST(english, physics, geography, chemistry)

从指定的列中获取最大值。它返回85

FIELD(
  GREATEST(english, physics, geography, chemistry),
  english, physics, geography, chemistry
)

GREATEAST()85)返回的值与作为FIELD()的下一个参数传递的值进行比较,并返回与返回的值相等的第一个值的位置。 GREATEST()。它返回3

ELT(
  FIELD(
    GREATEST(english, physics, geography, chemistry),
    english, physics, geography, chemistry
  ),
  'english', 'physics', 'geography', 'chemistry'
) AS class

ELT()使用FIELD()3)返回的索引从其下一个参数列表中选择该索引处的值。它返回geography

说明

虽然此查询提供了预期结果,但您可以简单地SELECT *找到最大值及其包含在客户端代码中的列(假设您没有编写MySQL存储过程)。

根据应用程序的结构和需求,还要考虑使用包含user_idclass_idpoints的表格;它为每个用户存储多行,每行包含用户在单个类上获得的点数。

答案 1 :(得分:0)

http://sqlfiddle.com/#!9/0f369/1

SELECT *,
  @m:=GREATEST(`english`, `physics`, `geography`, `chemistry`),
  IF(@m=`english`,'english',
     IF(@m=`physics`,'physics',
        IF(@m=`geography`,'geography',
           'chemistry'
        )
     )
  )
FROM results;