我的 mysql 数据库中设置了多对多表。团队可以参加多场比赛,每场比赛有 2 支球队。它们之间有一个名为 teams_games 的表。 SHOW CREATE TABLE 信息如下。
我已经弄乱了这个查询有一段时间了。此时我不关心它是否需要子查询、连接或联合。我已经尝试了所有这些,但没有一个是令人满意的,我想我错过了一些东西。我一直遇到的断开连接是从每场比赛中找到两个团队 ID,然后使用 tid 获取团队信息。
我想做的是,如果给定一个游戏 ID (gid),我可以查询以找到:
home_team_name, home_team_id, away_team_name, away_team_id, team_league(客场和主场是同一个联赛), games表的所有信息
Table Create Table
<pre><code> 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`)
</code></pre>
)
CREATE TABLE <code>teams_games</code> (
<pre><code>`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`)
</code></pre>
)
CREATE TABLE <code>games</code> (
<pre><code>`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`)
</code></pre>
)
最佳答案
为什么不直接删除 teams_games
表并更改 games
:
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,
`home_tid` int(10) unsigned NOT NULL,
`away_tid` int(10) unsigned NOT NULL,
PRIMARY KEY (`gid`)
)
然后你可以像这样写一个简单的连接:
SELECT
g.*,
h.name as home_team,
a.name as away_team,
h.league as league
FROM games AS g
INNER JOIN teams AS h ON g.home_tid = h.tid
INNER JOIN teams as a ON g.away_tid = a.tid
WHERE gid = ?
关于sql - Mysql多对多查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3104073/