在具有多个计数的查询中一起添加两个引用

时间:2014-05-01 21:48:51

标签: mysql

我正在查询一张名为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;

如何将yellowAmountredAmount一起添加并使用它来订购结果?

我试过这个,但是我收到了一个未知的列错误:

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;

1 个答案:

答案 0 :(得分:1)

这有两个原因不起作用:

  1. 基础表中不存在术语yellowAmountredAmount;你已经在SELECT子句本身中将它们定义为别名。 MySQL(以及大多数其他关系数据库)不支持在SELECT子句的其他地方使用SELECT子句的一部分别名。

  2. 即使MySQL允许您引用先前定义的别名,在这种情况下它也没有意义。 yellowAmountredAmount已经是SUMmed数量;为什么/你将如何再次使他们相处? SUM操作只能应用于您在GROUP BY操作中聚合的行中存在的值。

  3. 所以你必须按照@ 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实现都支持)。