MySQL выберите внутри выберите внутри выберите

#mysql #select #nested #parent #children

#mysql #выберите #вложенный #родительский #дочерние элементы

Вопрос:

То, что я хочу иметь, — это все родительские номера, которые являются дочерними элементами от нескольких других родителей, которые также являются дочерними элементами от одного другого родителя. Все строки находятся внутри одной таблицы.

Теперь то, что у меня есть до сих пор, это (и это работает):

 SELECT * 
FROM location 
WHERE parentid IN (
    SELECT id 
    FROM location 
    WHERE parentid IN (
        SELECT id 
        FROM location 
        WHERE parentid = 0
    )
)
 

Единственное, что мне интересно, это будет ли какой-нибудь лучший / более быстрый способ добиться того же самого? Таблица состоит примерно из 200.000 строк.

Комментарии:

1. Вы могли бы выполнить самосоединение. SELECT * FROM location a INNER JOIN location b ON b.parentid = a.parentid ....

Ответ №1:

Если я правильно понимаю, вы хотите внуков parentid = 0 . Лично я считаю, что явные объединения легче выполнять и, вероятно, приведут к лучшему плану выполнения:

 select l2.*
from location l join
     location l1
     on l1.parentid = l.parentid join
     location l2
     on l2.parentid = l1.id
where l.parentid = 0;
 

Единственное предостережение: возможно where , оператор должен быть where l.id = 0 . В этом случае вы действительно можете упростить запрос до:

 select l2.*
from location l1
     location l2
     on l2.parentid = l1.id
where l1.parentid = 0;