Mysql很多很多问题(排行榜/记分牌)

时间:2010-05-14 09:35:10

标签: mysql join

我正在为即将到来的世界杯做一个小项目。我正在根据国家队的小组建立一个名单/排行榜/评分板。这个想法是获得组内或淘汰赛阶段所有即将到来的比赛的信息(比分,比赛时间,比赛统计等)。目前我坚持使用数据库,因为我无法提出可以连续返回配对团队的查询。我有这3张桌子:

CREATE  TABLE IF NOT EXISTS `wc_team` (
      `id` INT NOT NULL AUTO_INCREMENT ,
      `name` VARCHAR(45) NULL ,
      `description` VARCHAR(250) NULL ,
      `flag` VARCHAR(45) NULL ,
      `image` VARCHAR(45) NULL ,
      `added` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ,
      PRIMARY KEY (`id`) ,

CREATE  TABLE IF NOT EXISTS `wc_match` (
      `id` INT NOT NULL AUTO_INCREMENT ,
      `score` VARCHAR(6) NULL ,
      `date` DATE NULL ,
      `time` VARCHAR(45) NULL ,
      `added` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ,
      PRIMARY KEY (`id`) , 

CREATE  TABLE IF NOT EXISTS `wc_team_has_match` (
      `wc_team_id` INT NOT NULL ,
      `wc_match_id` INT NOT NULL ,
      PRIMARY KEY (`wc_team_id`, `wc_match_id`) ,

我简化了表格,所以我们不会走错方向。现在我已经尝试了各种我能想到的连接和分组,但我似乎从来没有。

示例查询:

SELECT t.wc_team_id, t.wc_match_id, c.id.c.name, d.id, d.name
FROM wc_team_has_match AS t
LEFT JOIN wc_match AS s ON t.wc_match_id = s.id
LEFT JOIN wc_team AS c ON t.wc_team_id = c.id
LEFT JOIN wc_team AS d ON t.wc_team_id = d.id

返回:

 wc_team_id  wc_match_id    id name      id name    
         16           5        16 Brazil    16 Brazil
         18           5        18 Argentina 18 Argentina

但我真正想要的是:

    wc_team_id  wc_match_id     id name      id name    
             16           5     16 Brazil    18 Argentina

请记住,一个群组有更多匹配,我希望看到所有这些匹配不仅仅是一个。

任何指针或建议都会非常受欢迎,因为我在这个问题上像鸭子一样陷入困境:)。

2 个答案:

答案 0 :(得分:1)

由于足球比赛总是由两支球队组成,所以永远不会更多也不会更少,而且由于有一支球队1和一支球队2,所以顺序也很重要,我只想添加team_1和{ team_2中的{1}}字段,并删除wc_match表。

这会大大简化您的查询:

wc_team_has_match

编辑:刚刚注意到您还打算在淘汰赛阶段保留有关比赛的信息,其中每场比赛的球队可能尚未确定。您仍然可以使用相同的模型,使SELECT m.wc_match_id, t1.id AS Team_1_ID, t1.name AS Team_1, t2.id AS Team_2_ID, t2.name AS Team_2 FROM wc_match AS m JOIN wc_team t1 ON (t1.id = m.team_1) JOIN wc_team t2 ON (t2.id = m.team_2); team_1可以为空。在这种情况下,您可能希望使用team_2而不是LEFT JOINs来接收包含INNER JOINs个团队的结果集。 SQL中NULL的原因是定义未知信息,因此非常适合这种情况。

答案 1 :(得分:1)

我建议将您的team_has_match表格更改为teams_for_match,其中包含每个小组的参考资料:

CREATE TABLE `teams_for_match` (
  `match_id` INT,
  `team1_id` INT,
  `team2_id` INT,
  PRIMARY KEY (`match_id`, `team1_id`, `team2_id`)
);
然后,您可以选择两个团队进行匹配:

   SELECT *
     FROM `teams_for_match` tm
LEFT JOIN `wc_match` m
       ON tm.`match_id` = m.id
LEFT JOIN `wc_team` t1
       ON tm.`team1_id` = t1.id
LEFT JOIN `wc_team` t2
       ON tm.`team2_id` = t2.id;

我希望这可以按照您的预期运作。

PS。除此之外,您只需将team1_idteam2_id列添加到wc_team表中,无需创建其他表格

CREATE  TABLE IF NOT EXISTS `wc_match` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `score` VARCHAR(6) NULL ,
  `date` DATE NULL ,
  `time` VARCHAR(45) NULL ,
  `added` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ,
  `team1` INT FOREIGN KEY REFERENCES `wc_team`(`id`),
  `team2` INT FOREIGN KEY REFERENCES `wc_team`(`id`),
  PRIMARY KEY (`id`)
)