您好我想针对以下情况获得正确的查询:
user_id english physics geography chemistry
1 75 60 85 79
我想要一个mysql查询来比较结果并返回主题名称/列,他已经获得了最高的数字。
所以在这里我们看到用户一个地理位置最高。我想用mysql查询获得这个列名(地理)。
这是小提琴链接:table
答案 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_id
,class_id
和points
的表格;它为每个用户存储多行,每行包含用户在单个类上获得的点数。
答案 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;