我有一张比赛分数表;每次任务都有一排。为了获得每个用户的最佳分数,我创建了一个查询,该查询将为每个用户的每个任务提供最高分数,每个用户一行。这些分数将作为附加列添加(mission_1和mission_2)。到目前为止一切都很好。
但是现在我想总结这两个字段以获得每个用户的总最高分数。但是,MySQL不会让我在'字段列表'中说未知列'mission_1'。
是否有可能以某种方式对这些字段进行求和?
我也想知道是否有可能在单独的列(mission_1_id和mission_2_id)中获得具有最高分数的任务的相应row_id(我的表中的gsid)。但我有一种感觉,因为我正在使用MAX()。
SELECT m . * , max( m.id ) as max_id, max( submitted_on ) AS max_submitted_on,
ifnull( max(CASE WHEN mission =1 THEN score END ) , 0 ) AS mission_1_score,
ifnull( max(CASE WHEN mission =2 THEN score END ) , 0 ) AS mission_2_score,
mission_1_score + mission_2_score AS total_score
FROM game_sessions m
GROUP BY username
答案 0 :(得分:0)
不,不在同一select
声明中。您需要子查询或重复表达式。
子查询方法:
select m.* max_id, max_submitted_on, mission_1_score, mission_2_score,
mission_1_score + mission_2_score AS total_score
from (SELECT m . * , max( m.id ) as max_id, max( submitted_on ) AS max_submitted_on,
ifnull( max(CASE WHEN mission =1 THEN score END ) , 0 ) AS mission_1_score,
ifnull( max(CASE WHEN mission =2 THEN score END ) , 0 ) AS mission_2_score,
mission_1_score + mission_2_score AS total_score
FROM game_sessions m
GROUP BY username
) m
否则,请将原始select
语句更改为:
SELECT m . * , max( m.id ) as max_id, max( submitted_on ) AS max_submitted_on,
ifnull( max(CASE WHEN mission =1 THEN score END ) , 0 ) AS mission_1_score,
ifnull( max(CASE WHEN mission =2 THEN score END ) , 0 ) AS mission_2_score,
(ifnull( max(CASE WHEN mission =1 THEN score END ) , 0 ) +
ifnull( max(CASE WHEN mission =2 THEN score END ) , 0 )
) AS total_score
这似乎不优雅,但它是SQL标准的一部分。我认为目的是避免在诸如此类的情况下出现歧义:
select (a + b) as a, (a + 1) as c
a
中的(a + 1)
是指什么?在SQL标准中,它明确指出表中的列。
答案 1 :(得分:0)
你可以使用
max(CASE WHEN mission =1 THEN score END )