[英]Mysql Many to Many Query
我的mysql数据库中有许多表设置。 团队可以参加很多比赛,每场比赛有2个团队。 它们之间有一个表,称为team_games。 随后显示显示创建表信息。
我已经把这个查询弄乱了一段时间。 此时,我不在乎它是否需要子查询,联接或联合。 我已经尝试了所有这些,但是没有一个令人满意的,我想我缺少了一些东西。 我一直遇到的问题是从每个游戏中找到两个团队ID,然后使用TID来获取团队信息。
我想做的是,如果给定游戏ID(gid),我可以查询以下内容:
home_team_name,home_team_id,away_team_name,away_team_id,team_league(客场和主场将是同一个联赛),游戏表中的所有信息
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`)
)
为什么不放下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 = ?
select
th.name as home_team_name,
th.tid as home_team_id,
ta.name as away_team_name,
ta.tid as away_team_id,
th.league as team_league,
g.*
from games g
inner join teams_games tgh on (g.gid = tgh.gid and tgh.homeoraway = <HOME_VALUE>)
inner join teams_games tga on (g.gid = tga.gid and tga.homeoraway = <AWAY_VALUE>)
inner join teams th on (tgh.tid = th.tid)
inner join teams ta on (tga.tid = ta.tid)
where
g.gid = <GAME_ID>
我假设1 =家,2 =离家。 您可以适当地进行更改。
SELECT
HT.name AS home_team_name,
HT.tid AS home_team_id,
AT.name AS away_team_name,
AT.tid AS away_team_id,
HT.league AS team_league
FROM
teams_games HTG
INNER JOIN teams_games ATG ON
ATG.gid = HTG.gid AND
ATG.homeoraway = 2
INNER JOIN teams HT ON
HT.tid = HTG.tid
INNER JOIN teams AT ON
AT.tid = ATG.tid
WHERE
HTG.gid = ???
HTG.homeoraway = 1
我假设homeoraway = 1代表homeoraway = 0代表。
SELECT g.*, ht.name, ht.tid, at.name, at.tid, ht.league
FROM games g
JOIN team_games htg ON htg.gid = g.gid AND htg.homeoraway = 1
JOIN team ht ON ht.tid = htg.tid
JOIN team_games atg ON atg.gid = g.gid AND atg.homeoraway = 0
JOIN team at ON at.tid = atg.tid
通过将游戏加入主队的team_games,然后加入队的队信息,然后对客队进行相同的工作来实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.