Хорошее чтение для начала: Иерархические данные в MySQL (которые я имел обыкновение находить на веб-сайте MySQL.com, arghh)
Читать?
Вот как это можно сделать с помощью модели списка смежности. Но только для известного фиксированного количества вложений (четыре уровня вложенности для этого примера) .
Я бы выяснил, какие из моих страниц являются корневыми (дерева) . Затем выберите только те, которые имеют запрос. Поместите LIMIT x,x
в этот оператор выбора.
После этого следующее утверждение: (или что-то подобное)
string query = "
SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name IN('ELECTRONICS', '<some other name>');
";
Может вернуть что-то вроде этого:
+-------------+----------------------+--------------+-------+
| lev1 | lev2 | lev3 | lev4 |
+-------------+----------------------+--------------+-------+
| ELECTRONICS | TELEVISIONS | TUBE | NULL |
| ELECTRONICS | TELEVISIONS | LCD | NULL |
| ELECTRONICS | TELEVISIONS | PLASMA | NULL |
| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS | FLASH |
| ELECTRONICS | PORTABLE ELECTRONICS | CD PLAYERS | NULL |
| ELECTRONICS | PORTABLE ELECTRONICS | 2 WAY RADIOS | NULL |
| etc... | etc... | etc... | |
+-------------+----------------------+--------------+-------+
Хитрость заключается в том, чтобы использовать только корневые имена запроса с пределом (или идентификаторами, если хотите) в операторе IN()
запроса.
Это должно работать довольно неплохо до сих пор (в теории) .
Принцип вышеупомянутого запроса также может быть использован для определения количества потомков в корне дерева (с небольшой магией GROUP BY
и COUNT()
;) Также вы можете выясните, какие из ваших страниц являются корнями с этим принципом (хотя я бы сохранил это в табличных данных для повышения производительности)
Если вы хотите динамическое количество вложений (для почти бесконечного масштабирования) , реализация вложенного набора будет подходящим вариантом.