2014-05-01 5 views
0

J'interroge une table appelée Events pour les joueurs avec le plus de réservations de cartes jaunes et rouges (c'est une application de football). Un jaune vaut 1 point et un rouge vaut 3.Ajouter deux références ensemble dans une requête avec plusieurs comptes

J'ai cette requête:

SELECT player_id, first_name, last_name, slug, 
     SUM(CASE WHEN event_type.name = 'Yellow Card' THEN 1 ELSE 0 END) AS yellowAmount, 
     SUM(CASE WHEN event_type.name = 'Red Card' THEN 3 ELSE 0 END) AS redAmount 
FROM event 
INNER JOIN matches ON event.match_id = matches.id 
INNER JOIN player  ON event.player_id = player.id 
INNER JOIN event_type ON event.event_type_id = event_type.id 
WHERE matches.league_id = 94 
    AND (event_type.name = "Yellow Card" OR event_type.name = "Red Card") 
GROUP BY player_id; 

Comment ajouter yellowAmount et redAmount ensemble et l'utiliser pour commander le résultat?

J'ai essayé cela, mais je reçois une erreur de colonne inconnue:

SELECT player_id, first_name, last_name, slug, 
     SUM(CASE WHEN event_type.name = 'Yellow Card' THEN 1 ELSE 0 END) AS yellowAmount, 
     SUM(CASE WHEN event_type.name = 'Red Card' THEN 3 ELSE 0 END) AS redAmount, 
     SUM(yellowAmount + redAmount) AS total 
FROM event 
INNER JOIN matches ON event.match_id = matches.id 
INNER join player  ON event.player_id = player.id 
INNER JOIN event_type ON event.event_type_id = event_type.id 
WHERE matches.league_id = 94 
    AND (event_type.name = "Yellow Card" OR event_type.name = "Red Card") 
GROUP BY player_id 
ORDER BY total DESC; 
+0

sum (cas où type_événement.name = 'Carte Jaune' puis 1 sinon 0 fin) + somme (cas où type_événement.nom = 'Carte Rouge' puis 3 sinon 0 fin) – Strawberry

Répondre

1

Il y a deux raisons cela ne fonctionne pas:

  1. Les termes yellowAmount et redAmount n'existent pas dans les tables sous-jacentes; vous les avez définis comme des alias dans la clause SELECT elle-même. MySQL (avec la plupart des autres bases de données relationnelles) ne prend pas en charge l'utilisation d'alias d'une partie de la clause SELECT ailleurs dans la clause SELECT.

  2. Même si MySQL vous permettait de faire référence à des alias définis précédemment, dans ce cas, cela n'aurait pas de sens. yellowAmount et redAmount sont déjà des quantités SUMmed; pourquoi/comment les auriez-vous à nouveau? L'opération SUM ne peut être appliquée qu'aux valeurs présentes dans les lignes que vous agrégez dans l'opération GROUP BY.

Donc, vous devez soit répéter l'intégralité de l'instruction CASE comme suggéré dans @ commentaire de fraise, ou vous devez nid toute requête dans une autre requête qui ne fait ajouter les deux valeurs souhaitées:

select player_id, first_name, last_name, slug, yellowAmount + redAmount as total 
from (SELECT player_id, first_name, ... 
     FROM event 
     INNER JOIN ... 
     ... 
     GROUP BY player_id) a 
order by total desc; 

Notez que dans MySQL vous pouvez utiliser l'alias total de la clause SELECT dans la clause ORDER BY (bien que cela ne soit pas nécessairement supporté par toutes les implémentations SQL).

Questions connexes