一般情况执行左跨多到多表连接的条件
你如何执行左键跨越许多一对多的关系,加入时要一个条件添加到国外关系的一面?
具体案例
我们正在处理两个表:team
和pool
。还有一个team_pool
表作为它们之间的多对多联结表。此外,pool
有一个stage_id
列。
我想检索具有特定舞台的该团队的所有团队。如果池不存在,我希望池为NULL。示例,理想化结果:
+--------+----------+------+
| team | stage_id | pool |
+--------+----------+------+
| Team 1 | 2 | C |
| Team 2 | NULL | NULL | //this team doesn't belong to a pool for this stage (but it could belong to a pool for a different stage)
| Team 3 | 2 | G |
| Team 3 | 2 | H | //if a team belongs to a 2 pools for the same stage
| Team 4 | 2 | D |
如果相关,我使用的是MySQL。
SQL
下面是用于创建表(简化)SQL:
CREATE TABLE team (id BIGINT AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY(id));
CREATE TABLE team_pool (team_id BIGINT, pool_id BIGINT, PRIMARY KEY(team_id, pool_id));
CREATE TABLE pool (id BIGINT AUTO_INCREMENT, stage_id BIGINT, name VARCHAR(40) NOT NULL, PRIMARY KEY(id));
理想的解决方案
理想的解决办法:
- 不需要ch愤怒到我的模式(ORM真的想这样)
- 需要一个单一的非UNION查询。
尝试的解决方案
- 使用INNER JOIN,而不是一个LEFT JOIN从
team
到team_pool
和team_pool
到pool
。问题:我们失去了球队不属于池 - 从左边
team
到team_pool
和team_pool
到pool
JOIN使用WITH条件是stage_id
上pool
比赛是我们要寻找的。问题:当一个团队属于多个池时,我们会得到多个结果。添加一个GROUP BY没有帮助。
编辑:选择的解决方案
有很多很好的解决方案在这里。
鉴于我的理想解决方案是不可能的,我宁愿添加stage_id
到team_pool比使用UNION或子查询。这还有一个好处,就是让我强制一个团队每个阶段只能属于一个团队。它也使查询变得简单:
SELECT t.name, p.name, tp.stage_id FROM team t LEFT JOIN team_pool tp ON t.id = tp.team_id AND tp.stage_id = 2 LEFT JOIN pool p ON p.id = tp.pool_id
如果队伍为空,队2如何获得stage_id? – Snekse 2010-10-01 17:47:21
它不应该,我修好了。 – 2010-10-01 17:48:39
如果团队属于多个泳池,您是否可以添加您的理想结果以显示您的期望? – Snekse 2010-10-01 17:51:34