0

我已经阅读了一百个不同的“如何加入三个表”帖子,但似乎无法让我做我想做的事。它似乎与我在网上找到的示例不同,它们只是两个左连接。

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);
4

1 回答 1

1

您在单个查询中有多个连接,与上一个示例中的完全一样......除了您不应该混合连接样式。

select tests.name, testgroups.grouptype
from tests
left join testgroups on tests.id = testgroups.testid
left join platforms ON ......
where tests.platformA = 1 and platforms.name = 'platformA';
于 2013-03-08T19:24:31.193 回答