Предварительный запрос - выберите, суммируйте при условии и верните накопленное значение - PullRequest
0 голосов
/ 05 января 2019

Пользователь предсказывает победителя команды на данный матч. В зависимости от того, какая команда была спрогнозирована и является ли прогноз верным или нет, присуждается другой результат в зависимости от шансов выбранной команды. Рассмотрим следующие две таблицы SQL и их поля.

Matches table

и

enter image description here Я хотел бы запрос, который суммирует шансы всех пользователей, если прогнозы были правильными (то есть predictions.team_id должен совпадать с matches.match_winner) для идентификатора турнира 30. Конечный результат должен выглядеть следующим образом

enter image description here

Мэтью правильно предсказал совпадение 5 и 7 (коэффициент 3,4 + 2,4), всего 5,8 балла.

Невилл предсказал правильно матч 7 и 9 (коэффициент 2,4 + 2,0), всего 4,4 балла

Ответы [ 2 ]

0 голосов
/ 05 января 2019
SELECT
  USERNAME,
  SUM(IF(CASE WHEN MATCH_WINNER = TEAM_A, TEAM_A_ODDS, TEAM_B_ODDS))
FROM
  PREDICTIONS
INNER JOIN MATCHES
  ON MATCH_ID = MATCHES.ID AND 
    TEAM_ID = MATCH_WINNER
GROUP BY USERNAME;

но так как Neville predicted correctly match 7 and 9 (odds 2.4 + 2.0), total 4.4 points не удовлетворяет ...

SELECT
  USERNAME,
  SUM( TEAM_B_ODDS)
FROM
  PREDICTIONS
INNER JOIN MATCHES
  ON MATCH_ID = MATCHES.ID AND 
    TEAM_ID = MATCH_WINNER
GROUP BY USERNAME;

ОП суммирует всегда TEAM_B_ODDS

хотя я считаю, что ОП оценил Naville дело неправильно.

0 голосов
/ 05 января 2019

Используйте агрегированный запрос с условным значением SUM, например:

SELECT
    p.username,
    SUM(CASE WHEN m.match_winner = m.team_a THEN m.team_a_odds ELSE m.team_b_odds END)
FROM 
    predictions p
    INNER JOIN matches m
        ON p.match_id = m.id AND p.team_id = m.match_winner
WHERE p.tournament_id = 30
GROUP BY p.username
...