Мой первый пост здесь! Похоже, это место для мудрых;)
В настоящее время я нахожусь в центре тестирования с первой попыткой попробовать подход MPTT (измененный порядок предпросмотра дерева) для хранения данных в моей базе данных Mysql с помощью PHP.
Тем не менее, я пытаюсь найти наиболее ориентированный на производительность способ получить все элементы списка на определенном уровне с определенным родителем.
Это может привести к получению категорий Saab и Chrysler из приведенного ниже изображения, если родительский указатель будет называться «Bilar». (Это означает, что автомобили на шведском языке, если это не ваша самая сильная сторона;))
Как я не могу опубликовать изображения, вот ссылка на блок-схему: http://www.phpsidan.nu/files/mptt/mptt1.png
В настоящее время я делаю два запроса, чтобы делать то, что хочу, и довольно немного кода для вычисления уровня и выплескивания всех остальных элементов на одном уровне.
Есть ли лучший способ сделать это и, надеюсь, только с использованием одного запроса?
Большое спасибо!
Я уверен, что это можно было бы оптимизировать, однако при условии, что у вас есть столбцы «имя», «lft» и «rgt», следующее даст вам 2-го уровня братьев и сестер «Билар».
SELECT node.name, node.lft AS sort, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth FROM car AS node, car AS parent, car AS sub_parent, ( SELECT node.name, (COUNT(parent.name) - 1) AS depth FROM car AS node, car AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt AND node.name = "Bilar" GROUP BY node.name ORDER BY node.lft) AS sub_tree WHERE node.lft BETWEEN parent.lft AND parent.rgt AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt AND sub_parent.name = sub_tree.name GROUP BY node.name HAVING depth <= 2 ORDER BY node.lft
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ содержит информацию и примеры запросов на вложенных множествах
получение непосредственных детей в NS является сложным, поэтому некоторые люди предпочитают хранить явный parent_id вместе с «левыми» и «правильными» указателями.