0

我有一张游戏得分表;每个任务播放一排。为了获得每个用户的最佳分数,我创建了一个查询,该查询将为每个用户的每个任务提供最高分,每个用户一行。这些分数作为附加列(mission_1 和mission_2)添加。到目前为止,一切都很好。

但现在我想将这两个字段相加以获得每个用户的总最高分。但是,MySQL 不会让我在“字段列表”中显示未知列“任务_1”。

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

我还想知道是否可以在单独的列(mission_1_id 和mission_2_id)中获得最高分数的任务对应的row_ids(我的表中的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
4

2 回答 2

0

您可以使用

   max(CASE WHEN mission =1 THEN score END ) 
于 2013-04-22T13:29:50.390 回答
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

ain(a + 1)指的是什么?在 SQL 标准中,它引用表中的列是明确的。

于 2013-04-22T13:29:47.337 回答