sql - Mysql多对多查询

标签 sql mysql select

我的 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/

相关文章:

mysql - 这个 "no data"警告来自哪里? (光标循环)

php - 复杂SQL查询优化建议

Docker 更新后 Mysql 表丢失 : "TableName doesn' t exist in engine"

jquery - selectize 不适用于动态 knockout 选项绑定(bind)

sql - select * 的使用是否合理?

MySQL 从多个表中选择和最近的记录

mysql - 如何连接三个不同的表,其中一列是每个组件的总和?

Mysql连接多个周期到多个office

php - 使用php从html表单多次插入Mysql

php 视频和照片上传 : storing in database vs. uploading