Каскадный LEFT JOIN v.s. к югу выберите - PullRequest
0 голосов
/ 25 июня 2019

У меня есть 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

Эти запросы были упрощены, но основная логика та же.Они кажутся эквивалентными.1-й кажется "чище" синтаксически.Я не эксперт по SQL, и я довольно новичок в LEFT JOIN в частности, но, похоже, это способ ответить на такой вопрос о членстве, когда одна таблица содержит подмножество информации о другой таблице.Это правильный подход?

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Плохая форма для ответа на мой вопрос?

Это похоже на работу:

     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?

0 голосов
/ 25 июня 2019

Два запроса не совпадают.Первая возвращает строки для всех групп, членом которых является человек, с idx «супервизорами», где это необходимо.

Вторая возвращает одну строку для каждого члена сidx группы «супервайзеры», где это уместно.Вы должны выбрать версию, которая делает то, что вы хотите.

Если у вас есть логика, которую вы хотите, то в MySQL обычно лучше избегать подзапросов в предложении FROM, если это возможно.MySQL имеет тенденцию материализовать их, что затрудняет оптимизацию (я думаю, это улучшилось в более поздних версиях).

Кроме того, вы должны избегать запятых в предложении FROM и всегда использовать правильные, явные, стандартный JOIN синтаксис.

...