2013-04-02 2 views
1

У меня возникли трудности с текущей моделью моей таблицы 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); 

Это привело к ВСЕМУ и запрашиваемый завязаны в таблице в два раза дольше как неизменный стол (явно не то, что я ищу)

Я вполне уверен, что я просто делаю что-то не так с моим запросом, и поэтому я просто надеюсь, что кто-то может исправить все, что моя ошибка, и Направьте меня в правильном направлении.

Я знаю, что должно быть проще использовать модель вложенного набора, но мне просто не нравится этот параметр для сложности добавления новых параметров.

ответ

2

Похоже, вы очень близко. Ваше левое соединение гарантирует, что все записи из таблицы будут возвращены.

См. Ниже запрос.

SELECT c1.*, c2.id FROM category c1 INNER JOIN category c2 ON (c1.parent = c2.id); 
+0

Благодарим за быстрый ответ! Это * почти * идеально; Как я могу ограничить его только для захвата определенных детей, например, если бы я хотел только детей из «Программного обеспечения» в моем примере выше? – Bitwize

+0

Добавьте предложение where, указав, что родительский объект должен иметь раздел «программное обеспечение»: SELECT c1. *, C2.id FROM category c1 INNER JOIN category c2 ON (c1.parent = c2.id) WHERE c2.section = 'программное обеспечение'; – keelerm

+0

безупречный! Большое спасибо. Я попробовал добавить предложение where, прежде чем спрашивать, но я должен был положить его в неправильную область; это прекрасно работало. – Bitwize

Смежные вопросы