mysql - SQL获取2支球队的比赛记录

标签 mysql sql

我有一个包含游戏列表的表,其中包含团队 ID 和游戏得分。

这是表结构。

ID  HOMETEAM    HOMETEAMSCORE   AWAYTEAM    AWAYTEAMSCORE
  • 每场比赛中各队的得分将显示在各自的栏中。
  • 比赛未开始时,双方得分均为 0。
  • 比赛结束后,任何一场比赛都不能有 0-0 的比分。

我需要获取 2 个特定球队的比赛记录。例如,对于球队 1 和球队 2,我需要输出为 1-3,这意味着球队 1 战胜了球队 2 一次,球队 2 战胜了球队 1 3 次。

我正在使用下面的 SQL,它在某种程度上有效。但我需要将尚未开始的比赛输出为 0-0(分数为 0-0)。

SELECT least(homeTeam, awayTeam) team1,
       greatest(homeTeam, awayTeam) team2,
       sum(case when awayTeam > homeTeam
          then case when homeTeamScore > awayTeamScore then 1 else 0 end else case when homeTeamScore > awayTeamScore then 0 else 1 end
       end) team1Wins,
       sum(case when hometeam > awayteam
          then case when homeTeamScore > awayTeamScore then 1 else 0 end else case when homeTeamScore > awayTeamScore then 0 else 1 end
       end) team2Wins
FROM ow_sports_games 
GROUP BY least(homeTeam, awayTeam),
         greatest(homeTeam, awayTeam)

除此之外还有其他更好的方法来获得更好的 SQL 吗?

SQL fiddle :http://sqlfiddle.com/#!2/10326/4/1

编辑:

一些示例数据可以更详细地解释我的要求:

HOMETEAM    HOMETEAMSCORE   AWAYTEAM    AWAYTEAMSCORE
18          1               22              0
22          2               18              1
18          3               22              2
12          0               13              0

对于 18,22 队来说,输出应该是 2-1,因为 18 队有 2 场胜利,22 队有 1 场胜利

对于 12 队和 13 队,输出应该是 0-0,因为还没有比赛结束。

解释总体场景的输出示例:

HomeTeam      AwayTeam     Records
18             22          2-1
22             18          1-2
12             13          0-0

最佳答案

这与您在问题陈述中的输出相匹配(前 3 列是相同的,接下来的两列用于排序并确保我考虑到他们尚未播放但有记录的情况。请参阅 http://sqlfiddle.com/#!2/10326/43

SELECT DISTINCT hometeam, awayteam
    , CONCAT(IF(hometeam = LEAST(hometeam, awayteam),team1wins, team2wins),' - ', IF(awayteam = LEAST(hometeam, awayteam),team1wins, team2wins)) AS Head2HeadRecord
    , CONCAT(LEAST(hometeam, awayteam), GREATEST(hometeam, awayteam)) AS surrogateSort
    , notplayed
FROM ow_sports_games 
JOIN (SELECT LEAST(hometeam, awayteam) AS team1
       ,GREATEST(hometeam, awayteam) AS team2
       ,SUM(IF(LEAST(hometeam, awayteam) = hometeam AND homeTeamScore > awayTeamScore, 1,
                IF(LEAST(hometeam, awayteam) = awayteam AND awayTeamScore > homeTeamScore,1,0) 
              )
            ) AS team1Wins
      ,SUM(IF(GREATEST(hometeam, awayteam) = hometeam AND homeTeamScore > awayTeamScore, 1,
                IF(GREATEST(hometeam, awayteam) = awayteam AND awayTeamScore > homeTeamScore,1,0) 
              )
            ) AS team2Wins  
       ,SUM(IF(homeTeamScore=0 AND awayTeamScore=0,1,0)) AS notPlayed
      FROM ow_sports_games 
      GROUP BY team1, team2) AS trecords
  ON LEAST(hometeam, awayteam) = team1
    AND GREATEST(hometeam, awayteam) = team2
ORDER BY surrogateSort, hometeam,awayteam;

关于mysql - SQL获取2支球队的比赛记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19742284/

相关文章:

mysql - 按日历周的 SQL 销售报告

sql - EXISTS 不适用于 WITH 子句中的子查询

mysql - 从2列的优先关系中获取有序数据

php - 如果 where 子句是零整数,为什么 sql 查询返回一个值?

php - 如何将文本框中的字符串与数据库行中的密码匹配

mysql - SQL 查询 UPDATE 两行被另一行过滤

mysql - docker-compose:mariadb - 连接被拒绝

php - 获取 mysql 表数据的 md5/sha1 哈希?

php - 如果行值类似于第一行,则如何自动递增 1 并附加小数,否则为 2

javascript - 基于多个下拉列表的自定义搜索