繁体   English   中英

MySQL多对多查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM