Mysql 使用case when语句创建的Sum字段
我有一张有比赛分数的桌子;每执行一次任务,一排。为了获得每个用户的最佳分数,我创建了一个查询,该查询将为每个用户的每个任务(每个用户一行)提供最高分数。这些分数作为附加列添加(任务1和任务2)。到目前为止还不错 但现在我想将这两个字段相加,得到每个用户的最大总分。然而,MySQL不允许我在“字段列表”中使用未知列“mission_1” 是否有可能以某种方式对这些字段求和 我还想知道是否有可能在单独的列(任务1和任务2)中获得任务的对应行id(我表中的gsid)和最大分数。但是我有一种感觉,因为我使用的是MAX(),所以它不起作用Mysql 使用case when语句创建的Sum字段,mysql,sql,Mysql,Sql,我有一张有比赛分数的桌子;每执行一次任务,一排。为了获得每个用户的最佳分数,我创建了一个查询,该查询将为每个用户的每个任务(每个用户一行)提供最高分数。这些分数作为附加列添加(任务1和任务2)。到目前为止还不错 但现在我想将这两个字段相加,得到每个用户的最大总分。然而,MySQL不允许我在“字段列表”中使用未知列“mission_1” 是否有可能以某种方式对这些字段求和 我还想知道是否有可能在单独的列(任务1和任务2)中获得任务的对应行id(我表中的gsid)和最大分数。但是我有一种感觉,因为我
否,不在相同的
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+1)
中的a
指的是什么?在SQL标准中,它引用表中的列是明确的。您可以使用
max(CASE WHEN mission =1 THEN score END )
你不能对别名求和,你必须对每个表达式求和,比如ifnull(..任务=1…)+ifnull(..任务=2…)谢谢,这也是Gordon回答的要点。非常好,也谢谢你解释原因。
max(CASE WHEN mission =1 THEN score END )