为表SQL的每个成员选择不同的记录

时间:2014-12-13 01:36:11

标签: mysql sql select subquery mariadb

我有一个包含两个表,匹配和团队的数据库。团队表很简单,它包含一个包含20个团队列表的字段。匹配表记录了团队之间的比赛。字段如下(带有数据示例):

 +------+----------+-------------+-----------+-----------+--------+---------+
 | Week | HomeTeam | AwayTeam    | HomeScore | AwayScore | Result | MATCHID |
 +------+----------+-------------+-----------+-----------+--------+---------+
 |    1 | Stoke    | Aston Villa |         0 |         1 | A      |     151 |
 +------+----------+-------------+-----------+-----------+--------+---------+

我的问题是,如何以每个团队获得的积分等形式从中返回有用的数据?我可以计算给定团队获得的积分,但不能计算表中所有团队的积分。例如,我可以用

计算利物浦的积分
SELECT
 (SELECT COUNT(matches.Result)*3 
   FROM matches 
   WHERE (HomeTeam='Liverpool' AND Result='H') OR (AwayTeam='Liverpool' AND Result='A'))+
 (SELECT COUNT(matches.Result) 
   FROM matches 
   WHERE (HomeTeam='Liverpool' OR AwayTeam='Liverpool') AND Result='D');

将吐出' 21'的输出。但我真正想要的是一个团队列表(由团队'表定义)和每个团队获得的积分。我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

您需要使用GROUP BY来获取每个人的团队统计信息。然后,您可以使用条件聚合来获得所需的结果。

以下是SUMCASE的示例:

SELECT
  t.teamname,
  3*SUM(
    CASE WHEN t.teamname = m.hometeam AND m.result = 'H' THEN 1
         WHEN t.teamname = m.awayteam AND m.result = 'A' THEN 1
         ELSE 0
    END) + 
  SUM(
    CASE WHEN m.result = 'D' THEN 1
         ELSE 0
    END)
FROM teams t
  JOIN matches m ON t.teamname in (hometeam,awayteam)
GROUP BY 
  t.teamname