2013-04-22 29 views
0

我有一個包含遊戲分數的表;每個任務都有一排播放。爲了獲得每個用戶的最佳分數,我創建了一個查詢,該查詢將爲每個用戶提供每個任務的最高分數,每個用戶只有一行。這些分數被添加爲額外的列(mission_1和mission_2)。到現在爲止還挺好。用語句創建的總和字段當語句

但是現在我想總結這兩個字段以獲得每個用戶的總最高分數。但是,MySQL不會讓我在'字段列表'中說'未知'列'mission_1'。

是否有可能以某種方式獲得這些字段總結?

我也想知道是否有可能得到相應的row_ids(gsid在我的表中)的任務與最高分在不同的列(mission_1_id和mission_2_id)。但我有一種感覺,因爲我正在使用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

你不能總結別名,你必須要總結每個expresions的,比方說IFNULL(....使命= 1 ...)+ IFNULL(。 ......使命= 2 ......) – Nico 2013-04-22 13:29:01

+0

謝謝,這也是戈登答案的要旨。 – Whiskey 2013-04-22 15:21:25

回答

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 + 1)a指什麼?在SQL標準中,它引用表中的列是明確的。

+0

非常好,謝謝你爲什麼解釋。 – Whiskey 2013-04-22 15:20:38

0

可以使用

max(CASE WHEN mission =1 THEN score END)