级联LEFT JOIN诉子选择

时间:2019-06-25 02:52:57

标签: mysql sql subquery left-join

我有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来说还很陌生,但这似乎是回答这种成员资格问题的方法,其中一个表包含有关另一表的信息的子集。这是正确的方法吗?

2 个答案:

答案 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的扩展名?