我已经阅读了一百个不同的“如何加入三个表”帖子,但似乎无法让我做我想做的事。它似乎与我在网上找到的示例不同,它们只是两个左连接。
tests
-----
id
name
platformA <<-- boolean, platformA supports test?
platformB
platformX
testgroups <<-- tuple (testid,platid) is unique
----------
testid <<-- matches 'id' in 'tests' table above
platid <<-- matches id in 'platforms' table below
grouptype
platforms
---------
id
name <<-- corresponds to column name 'platform?' in 'tests'
好的,所以我知道我想离开加入 testgroups 到测试,因为我想要一个结果,它在平台 A 为 1 的“测试”中的每个测试名称都有一行,无论测试组中是否有这样的条目。我不知道如何让平台表参与进来。这是我所拥有的不起作用的:
select tests.name, testgroups.grouptype from tests
left join testgroups on (tests.id = testgroups.testid)
where tests.platformA = 1;
这不起作用,因为测试组可以有多个 testid = 2,每个 platid = ?? 一个。元组保证是唯一的,但不是任何一列本身。因此,对于每个 tests.name,它为每个平台提供了一行。我需要通过我知道的平台名称(比如platformA)来限制它,但我在表testgroups中没有访问权限。所以,如果我知道 platid 而不是平台名称,我可以这样做,这确实有效:
select tests.name, testgroups.grouptype from tests
left join testgroups on (tests.id = testgroups.testid and testgroups.platid = 27)
where tests.platformA = 1;
我知道我只想要 platformA,但我不知道它的 id 是(在上面的示例中)27,而无需在平台表中查找它。如何将其合并到我的查询中?我已经尝试了很多组合,但没有一个是完全正确的。这是我认为可能有效的一个示例:
select tests.name, testgroups.grouptype from tests, platforms
left join testgroups on (tests.id = testgroups.testid and platforms.name = 'platformA')
where tests.platformA = 1;
这似乎是非法的语法。我也尝试了多个左连接,这对我不起作用。
我很喜欢这个答案,但也很想解释一下它为什么会起作用,因为我已经有一段时间了。
谢谢,大卫
==== 更新 ====
我认为@Marc 几乎是正确的,但它通过 testgroups.platid 具有该平台数据的行来限制我的输出。
这是我尝试使用他的答案并给出我的完整查询:
select tests.name, testgroups.grouptype from tests
left join testgroups on (tests.id = testgroups.testid)
left join platforms on (testgroups.platid = platforms.id)
where tests.platformA = 1 and (platforms.name = 'platformA' or platforms.id is null);