2013-04-22 3 views
0

У меня есть таблица с игровыми счетами; одна строка для каждой миссии. Чтобы получить лучшие баллы для каждого пользователя, я создал запрос, который даст мне максимальный балл для каждой миссии для каждого пользователя с одной строкой для каждого пользователя. Эти баллы добавляются в виде дополнительных столбцов (mission_1 и mission_2). Все идет нормально.Суммированные поля, созданные с регистром

Но теперь я хочу суммировать эти два поля, чтобы получить общий максимальный балл для каждого пользователя. Однако MySQL не позволит мне и говорит Неизвестный столбец «mission_1» в «списке полей».

Возможно ли, чтобы эти поля суммировались?

Мне также интересно узнать, можно ли получить соответствующую строку_иды (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

вы не можете подвести псевдоним, вы должны суммировать каждый из как выражения, скажем IFNULL (.... миссия = 1 ...) + IFNULL (. ... mission = 2 ...) – Nico

+0

спасибо, это было сутью ответа Гордона. – Whiskey

ответ

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 недвусмысленно, что он относится к столбцу в таблице.

+0

Отлично, и спасибо за объяснение, почему. – Whiskey

0

вы можете использовать

max(CASE WHEN mission =1 THEN score END) 
Смежные вопросы