MySQL, включающий сумасшедшие множественные самостоятельные соединения

Как часть процесса замены некоторого старого кода, который использовал невероятно медленный вложенный выбор, я закончил с запросом, который выглядит следующим образом:

SELECT r3.r_id AS r3_id, r2.r_id AS r2_id, r1.r_id AS r1_id
FROM
table_r r3
LEFT JOIN (
  table_r r2
  INNER JOIN (
    table_r r1
    INNER JOIN table_d d ON r1.r_id = d.r_id
  ) ON r2.r_id = r1.parent_id
) ON r3.r_id = r2.r_id
WHERE d.d_id = 3

Так что в самом глубоком соединении я ищу записи в table_r (копия r1) которые имеют отношение с подмножеством записей из table_d,

В следующем выходе я ищу записи во втором экземпляре table_r (r2) чей основной индекс (r_id) соответствует родительскому индексу (parent_id) записей из предыдущего объединения.

Тогда я пытаюсь сделать LEFT JOIN с третьей копией table_r (r3), просто совпадающий r_id с r_id предыдущего объединения. Идея этого внешнего соединения состоит в том, чтобы получить ВСЕ записи из table_r, но затем сделать эквивалент NOT IN выберите с помощью дополнительного условия (еще не в моем запросе), чтобы определить, какие записи в r3 иметь NULLs за r2_id,

Проблема в том, что LEFT JOIN не дает мне все table_r, Это дает мне то же подмножество записей, которое я получаю без окончательного соединения - другими словами, то же самое, что и INNER JOIN, Так что, хотя я ожидаю 1208 записей, я получаю 508.

Я знаю, что, должно быть, я тут что-то делаю...

1 ответ

Что произойдет, если вы попробуете это?

SELECT r3.r_id AS r3_id, r2.r_id AS r2_id, r1.r_id AS r1_id
FROM
table_r r3
LEFT JOIN (
  table_r r2
 INNER JOIN (
   table_r r1
   INNER JOIN table_d d ON r1.r_id = d.r_id AND d.d_id = 3
 ) ON r2.r_id = r1.parent_id
) ON r3.r_id = r2.r_id

Я переместил предложение d.d_id = 3 из условия where в квалификаторы INNER JOINS ON.

Другие вопросы по тегам