我正在为即将到来的世界杯做一个小项目。我正在根据国家队的小组建立一个名单/排行榜/评分板。这个想法是获得组内或淘汰赛阶段所有即将到来的比赛的信息(比分,比赛时间,比赛统计等)。目前我坚持使用数据库,因为我无法提出可以连续返回配对团队的查询。我有这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
请记住,一个群组有更多匹配,我希望看到所有这些匹配不仅仅是一个。
任何指针或建议都会非常受欢迎,因为我在这个问题上像鸭子一样陷入困境:)。
答案 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_id
和team2_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`)
)