【问题标题】:Selecting different records for each member of a table SQL为表 SQL 的每个成员选择不同的记录
【发布时间】:2015-02-11 19:29:45
【问题描述】:

我有一个包含两个表、比赛和球队的数据库。团队表很简单,它包含一个包含 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”。但我真正想要的是一个团队列表(由“团队”表定义)以及每个团队获得的积分。我该怎么做?

【问题讨论】:

    标签: mysql sql select subquery mariadb


    【解决方案1】:

    您需要使用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
    

    【讨论】:

    • 好的,这是有道理的。我需要先玩一下 b/c 我遇到语法错误
    • 忘了说 - 谢谢!
    • @user2784067 -- np,很高兴它有帮助。
    猜你喜欢
    • 1970-01-01
    • 2015-12-27
    • 2021-02-25
    • 2011-03-22
    • 2012-09-04
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多