Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用case when语句创建的Sum字段_Mysql_Sql - Fatal编程技术网

Mysql 使用case when语句创建的Sum字段

Mysql 使用case when语句创建的Sum字段,mysql,sql,Mysql,Sql,我有一张有比赛分数的桌子;每执行一次任务,一排。为了获得每个用户的最佳分数,我创建了一个查询,该查询将为每个用户的每个任务(每个用户一行)提供最高分数。这些分数作为附加列添加(任务1和任务2)。到目前为止还不错 但现在我想将这两个字段相加,得到每个用户的最大总分。然而,MySQL不允许我在“字段列表”中使用未知列“mission_1” 是否有可能以某种方式对这些字段求和 我还想知道是否有可能在单独的列(任务1和任务2)中获得任务的对应行id(我表中的gsid)和最大分数。但是我有一种感觉,因为我

我有一张有比赛分数的桌子;每执行一次任务,一排。为了获得每个用户的最佳分数,我创建了一个查询,该查询将为每个用户的每个任务(每个用户一行)提供最高分数。这些分数作为附加列添加(任务1和任务2)。到目前为止还不错

但现在我想将这两个字段相加,得到每个用户的最大总分。然而,MySQL不允许我在“字段列表”中使用未知列“mission_1”

是否有可能以某种方式对这些字段求和

我还想知道是否有可能在单独的列(任务1和任务2)中获得任务的对应行id(我表中的gsid)和最大分数。但是我有一种感觉,因为我使用的是MAX(),所以它不起作用


否,不在相同的
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 )