【问题标题】:SQL to get Team Records from Games DatabaseSQL 从游戏数据库中获取团队记录
【发布时间】:2013-10-13 15:34:59
【问题描述】:

对于我的一个运动相关项目,我需要显示球队的记录数。

示例:“Team 1”和“Team 2”打了 5 场比赛。 “Team 1”赢了 3 次,“Team 2”赢了 2 次。所以输出应该是(3-2)。

这是包含一些数据的表结构。

ID ---- TEAM1 ---- SCORE1 ---- TEAM2 ---- SCORE2
1       70         1           73         2
2       74         0           70         1
3       74         2           73         1
4       73         1           70         0

输出应该是这样的:

TEAM1 ---- TEAM2---- RECORD
70         73         2-0
74         70         0-1
74         73         1-0

注意:

  • 总会有赢家,没有一场比赛可以平局。
  • 在输出中,team1 和 team2 的组合应该是唯一的。

SQL Fiddle : http://sqlfiddle.com/#!2/4dead/1/0

【问题讨论】:

  • 你有什么问题/你在纠结什么。
  • 建议:使用多对多关系代替匹配 ID + 团队。在表中拥有team1team2 列不是一个好的数据库设计,迟早会给您带来问题。 (仅对于这个问题,多对多关系已经更容易了)
  • 我无法获得最终的记录。我可以知道哪支球队在给定的比赛中获胜.. 但最终结果应该是所有比赛的组合。
  • @SimonAndréForsberg:数据库是这样的,我现在几乎无法控制它。
  • @Purus 那么这是未来项目需要考虑的事情。

标签: mysql sql database


【解决方案1】:

这里的棘手问题是要处理在主场和客场比赛的同一支球队。这可以通过(大量)case 语句来解决。

基本方法是重新格式化数据,让 id 最低的团队首先出现。

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
  games
group by
   least(homeTeam, awayTeam),
   greatest(homeTeam, awayTeam);

SQL Fiddle

或者稍微紧凑一些,但可能更难理解:

select 
   least(homeTeam, awayTeam) team1,
   greatest(homeTeam, awayTeam) team2,
   sum(case sign(awayTeam - homeTeam) 
       when sign(homeTeamScore - awayTeamScore) then 1
       else 0 end) team1Wins,
   sum(case sign(awayTeam - homeTeam) 
       when sign(awayTeamScore - homeTeamScore) then 1
       else 0 end) team2Wins
from
  games
group by
   least(homeTeam, awayTeam),
   greatest(homeTeam, awayTeam);

SQL Fiddle

【讨论】:

  • 看来您已经解决了问题。我将用我的数据对其进行测试并接受这个问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 2011-08-18
  • 2016-03-27
相关资源
最近更新 更多