【问题标题】:Mysql Many to Many with Count and math带有计数和数学的Mysql多对多
【发布时间】:2011-03-09 20:06:19
【问题描述】:

我的 mysql 数据库中有很多对多的表设置。球队可以参加多场比赛,每场比赛有2支球队。在它们之间有一个名为 teams_games 的表。

我要做的是为每个团队创建统计数据。理想的打印输出是:

team_id、team_name、胜负、平局、错误

我的问题是将哪个球队是主队或客队的数学联系起来,如果他们赢了,然后计算这些。然后,我必须将这些与每支球队离开并获胜的次数相加。然后最终将所有内容结合在一起。我当前的查询结构(不能正常工作)与创建表信息一起在下面。有什么想法吗?

SELECT t.*, COUNT(g_wins.home_score > g_wins.away_score) AS wins, COUNT(g_wins.home_score < g_wins.away_score) AS losses FROM teams as t JOIN teams_games AS t_g_wins ON t_g_wins.tid = t.tid JOIN games AS g_wins on t_g_wins.gid = g_wins.gid"

Table Create Table

 teams  CREATE TABLE `teams` (
 `tid` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(60) NOT NULL,
`league` varchar(2) NOT NULL,
`active` tinyint(1) NOT NULL,
PRIMARY KEY (`tid`)

)

CREATE TABLE teams_games (

`tid` int(10) unsigned NOT NULL,
`gid` int(10) unsigned NOT NULL,
`homeoraway` tinyint(1) NOT NULL,
PRIMARY KEY (`tid`,`gid`),
KEY `gid` (`gid`),
CONSTRAINT `teams_games_ibfk_1` FOREIGN KEY (`tid`) REFERENCES `teams` (`tid`),
CONSTRAINT `teams_games_ibfk_2` FOREIGN KEY (`gid`) REFERENCES `games` (`gid`)

)

CREATE TABLE games (

`gid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`location` varchar(60) NOT NULL,
`time` datetime NOT NULL,
`description` varchar(400) NOT NULL,
`error` smallint(2) NOT NULL,
`home_score` smallint(2) DEFAULT NULL,
`away_score` smallint(2) DEFAULT NULL,
PRIMARY KEY (`gid`)

)

【问题讨论】:

  • 你能改变你的数据结构吗?

标签: sql mysql


【解决方案1】:

你把事情复杂化了:这应该是一个 2-n 而不是 n-m 的关系。 去掉 teams_games 表并为游戏表创建 2 个字段,例如:home_tidaway_tid

EDIT:然后查询将是类似的:

select t.tid, t.name, 
       sum(g.home_score < g.away_score xor t.tid = g.home_tid) wins, 
       sum(g.home_score > g.away_score xor t.tid = g.home_tid) losses, 
       sum(g.home_score = g.away_score) draws
  from games g
       join teams t on t.tid = g.home_tid or t.tid = g.away_tid
 group by t.tid

所以答案是使用 sum,否则它会计算输出中的真值和假值,即连接产生的总行数。

EDIT2

select t.tid, t.name, 
       sum(g.home_score < g.away_score xor tg.homeoraway) wins, 
       sum(g.home_score > g.away_score xor tg.homeoraway) losses, 
       sum(g.home_score = g.away_score) draws
  from games g
  join team_games tg on tg.gid = g.gid
  join teams t on t.tid = tg.tid
 group by t.tid

【讨论】:

  • 确实,不要解决可以简化的问题。简化它。也就是说,也许开发者想考虑多队比赛的可能性(那些甚至有意义吗?)。
  • 他已经在游戏桌中有home_scoreaway_score,-.-
  • 是的,我同意它比它需要的更复杂,因为它不是 n-m 关系。但是,对于已经构建和填充的表以及与数据库交互的其他代码,我希望有一种方法可以使用当前设置来执行此操作。我将来会更换桌子,但由于这是现场直播,我不想现在就更换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
相关资源
最近更新 更多