У меня возникли трудности с текущей моделью моей таблицы MySQL, а именно, что я не могу правильно запросить все дочерние узлы определенного родителя. Как указано в заголовке, я использую модель смежности.Захват дочерних узлов родителя с использованием модели смежности в MySQL
Проблема в том, что большинство методов, которые я нашел в Интернете, либо запросят все листовые узлы, либо выберите больше, чем просто то, что я пытаюсь захватить.
Первый учебник я следовал был на MikeHillyer.com, и его решение было эффекта:
SELECT t1.name FROM
category AS t1 LEFT JOIN category as t2
ON t1.category_id = t2.parent
WHERE t2.category_id IS NULL;
Проблема с этим, он запрашивает все узлы листьев, а не только те, связанных с к родителям. Он также предложил использовать модель вложенного набора, которую я не хочу использовать из-за того, что это немного сложнее вставить новые узлы (я действительно понимаю, что это значение, но я бы просто не захотел прибегать к нему).
Следующее решение, которое я нашел, было на общем slideshow на слайде 53 (найдено из другого ответа здесь, на StackOverflow). Это решение должно запрашивать у непосредственных детей узла, только ... Решение, похоже, не работает для меня.
Вот их решение:
SELECT * FROM Comments cl
LEFT JOIN Comments c2
ON(c2.parent_id = cl.comment_id);
Теперь, мой стол, немного отличается, и поэтому я приспособил часть кода для нее. Краткая выдержка из моей таблицы выглядит следующим образом:
Table: category
id | parent | section | title | ...
----+--------+----------+----------+-----
1 | NULL | home | Home | ...
2 | NULL | software | Software | ...
3 | 2 | software | Desktop | ...
4 | 2 | software | Mobile | ...
5 | NULL | about | About | ...
6 | 5 | about | Legal | ...
... | ... | ... | ... | ...
Когда я изменил приведенный выше запрос, я сделал следующее:
SELECT * FROM category cat1
LEFT JOIN category cat2
ON(category.parent = cl.id);
Это привело к ВСЕМУ и запрашиваемый завязаны в таблице в два раза дольше как неизменный стол (явно не то, что я ищу)
Я вполне уверен, что я просто делаю что-то не так с моим запросом, и поэтому я просто надеюсь, что кто-то может исправить все, что моя ошибка, и Направьте меня в правильном направлении.
Я знаю, что должно быть проще использовать модель вложенного набора, но мне просто не нравится этот параметр для сложности добавления новых параметров.
Благодарим за быстрый ответ! Это * почти * идеально; Как я могу ограничить его только для захвата определенных детей, например, если бы я хотел только детей из «Программного обеспечения» в моем примере выше? – Bitwize
Добавьте предложение where, указав, что родительский объект должен иметь раздел «программное обеспечение»: SELECT c1. *, C2.id FROM category c1 INNER JOIN category c2 ON (c1.parent = c2.id) WHERE c2.section = 'программное обеспечение'; – keelerm
безупречный! Большое спасибо. Я попробовал добавить предложение where, прежде чем спрашивать, но я должен был положить его в неправильную область; это прекрасно работало. – Bitwize