我有2个查询:
1)
SELECT person.idx, person.name, groups.idx
FROM people
LEFT JOIN membership
ON membership.person=person.idx
LEFT JOIN groups
ON groups.name='supervisors'
AND membership.group=groups.idx
2)
SELECT person.idx, person.name, a.idx
FROM people
LEFT JOIN
(SELECT group.idx, membership.person
FROM groups, membership
WHERE membership.group=group.idx
AND group.name='supervisors') a
ON a.person=person.idx
这些查询已经简化,但是核心逻辑是相同的。它们似乎是等效的。第一个在语法上似乎“更干净”。我不是SQL专家,特别是对LEFT JOIN来说还很陌生,但这似乎是回答这种成员资格问题的方法,其中一个表包含有关另一表的信息的子集。这是正确的方法吗?
答案 0 :(得分:0)
两个查询不相同。第一个返回一个人所属的 all 组的行,并在适当的情况下返回“ {supersors””的idx
。
第二个返回每个成员一行,并在适当的地方加上“主管”组的idx。您应该选择能够满足您需求的版本。
一旦有了所需的逻辑,然后在MySQL中,通常最好避免在FROM
子句中进行子查询。 MySQL有实现它们的趋势,这使优化变得更加困难(我认为在最新版本中这种情况会变得更好)。
此外,您应避免在FROM
子句中使用逗号,并始终使用正确的,明确的标准 JOIN
语法。
答案 1 :(得分:0)
回答我自己的问题的表格不正确?
这似乎可行:
SELECT person.idx, person.name, groups.idx
FROM people
LEFT JOIN (groups, membership)
ON groups.name='supervisors'
AND groups.person=person.idx
AND membership.group=groups.idx
也许是仅MySQL的扩展名?