我正在查询一张名为Events
的桌子,用于预订黄牌和红牌最多的玩家(这是一个足球应用程序)。黄色值1点,红色值3点。
我有这个问题:
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;
如何将yellowAmount
和redAmount
一起添加并使用它来订购结果?
我试过这个,但是我收到了一个未知的列错误:
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 :(得分:1)
这有两个原因不起作用:
基础表中不存在术语yellowAmount
和redAmount
;你已经在SELECT子句本身中将它们定义为别名。 MySQL(以及大多数其他关系数据库)不支持在SELECT子句的其他地方使用SELECT子句的一部分别名。
即使MySQL允许您引用先前定义的别名,在这种情况下它也没有意义。 yellowAmount
和redAmount
已经是SUMmed数量;为什么/你将如何再次使他们相处? SUM操作只能应用于您在GROUP BY操作中聚合的行中存在的值。
所以你必须按照@ Strawberry的评论中的建议重复整个CASE语句,或者你必须将整个查询嵌套在另一个除了添加两个所需值之外什么都不做的查询中:
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;
请注意,在MySQL中, 允许使用ORDER BY子句中SELECT子句的total
别名(尽管并非所有SQL实现都支持)。