
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
04.08.2013, 09:17:33
|
|||
|---|---|---|---|
|
|||
Получение id всех подкатегорий (деток) из необходимой (условно корневой) |
|||
|
#18+
Имеется таблица содержащая 3 столбца: name, id, parent. Для структуризации категорий и под категорий (т.е. у категории если есть родительский, то в parent стоит id родителя из этой же таблицы) Уровень вложенности на настоящее время 3, но может расширяться. Пример дерева категорий Категория (id=1, parent=0) --ПодКатегория1 (id=2, parent=1) ----ПодКатегория категории1 (id=5, parent=2) ----ПодКатегория категории2 (id=6, parent=2) --Подкатегория2 (id=3, parent=1) ----ПодКатегория категории1 (id=7, parent=3) ----ПодКатегория категории2 (id=8, parent=3) --Подкатегория3 (id=4, parent=1) ----ПодКатегория категории1 (id=9, parent=4) ----ПодКатегория категории2 (id=10, parent=4) не могу сообразить с запросом, чтобы получая id Любой из уровня категорий, выбрать все id её подкатегорий. Например по id=2, получать таблицу с id=5 и id=6 А указав id=1, получить таблицу с id-шниками: 5, 6, 7, 8, 9, 10 (можно и включая id = 2, 3, 4, это на дальнейшую обработку не повлияет) Наткнулся на запрос в стиле: SET @child_id = 120001; SELECT @child_id , @child_id := (SELECT `parent` FROM `categories` WHERE `id` = @child_id LIMIT 1) FROM `categories` WHERE @child_id IS NOT NULL Поднимает от детки всех родителей. попытался в обратную сторону копнуть: SET @parent_id = 111000; SELECT @parent_id , @parent_id := ( SELECT `id` FROM `categories` WHERE `parent` = @parent_id LIMIT 1 ) FROM `categories` WHERE @parent_id IS NOT NULL Но получил всего лишь 2 строкb с id Родителя и первой детки (из за limit 1) но менять limit не могу, т.к. идет сравнение @child_id := (массив не принимает) Применение вместо := оператора IN и убрав LIMIT ни к чему полезному не привело (выводит 111000 для всех строк таблицы) Предоставить файлы базы не могу из-за конфиденциальности, но думаю структура понятна. Полная выборка категорий и потом обработка на php с помощью рекурсии не подходит, т.к. необходимо выполнить выборку одним запросом sql (далее по этим категориям будет проводиться выборка товаров из другой таблицы) Вроде тема достаточно распространенная должна быть (для интернет магазинов думаю очень распространена) но поисковики ничего дельного кроме вышеперечисленного не предлагают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.08.2013, 10:37:04
|
|||
|---|---|---|---|
|
|||
Получение id всех подкатегорий (деток) из необходимой (условно корневой) |
|||
|
#18+
Неужели никто не сталкивался с такой проблемой? или возможно решение только посредством нескольких запросов с рекурсией на php в стиле <?php function getCategory() { $query = mysql_query("SELECT id,parent,name,orderby FROM `categories` ORDER BY orderby, name, id"); $result = array(); while ($row = mysql_fetch_array($query)) { $result[$row["parent"]][] = $row; } return $result; } //В переменную $category_arr записываем все категории $category_arr = getCategory(); /** * Вывод дерева * @param Integer $parent - id-родителя * @param Integer $level - уровень вложености */ function outTreeUp($parent, $level) { global $category_arr; //Делаем переменную $category_arr видимой в функции global $parent_now; //Делаем переменную $parent_now видимой в функции if (isset($category_arr[$parent])) { //Если категория с таким parent существует foreach ($category_arr[$parent] as $value) { //Обходим /** * Выводим категорию */ echo "<p style='margin-left:".($level * 75)."px;'>".$tire[$level]."<a href='productions__edit.php?id=".$value["id"]."'>".$value["name"]."</a> <span class='gray'>[".$value["orderby"]."]</span></p>"; $level = $level + 1; //Увеличиваем уровень вложености //Рекурсивно вызываем эту же функцию, но с новым $parent и $level outTreeUp($value["id"], $level); $level = $level - 1; //Уменьшаем уровень вложености } } } if (!isset($id)) { //echo "<p>Выберите объект для редактирования:</p>"; outTreeUp(0, 0); } ?> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.08.2013, 10:58:43
|
|||
|---|---|---|---|
|
|||
Получение id всех подкатегорий (деток) из необходимой (условно корневой) |
|||
|
#18+
AntonSHihovУровень вложенности на настоящее время 3, но может расширяться. для неограниченой вложенности - задача в МуСКЛ "почти" не решается про "почти" - есть топик в ФАКе - четай если можно "заложится" на какое-то макс.к-во вложенности (т.е., например, не больше 5-ти), то можно сделать вьюху, в которой будет объединённые, через UNION, самосоединения таб., и для таких задач использовать её а самое простое - денормализовать немного таб. - завести в ней поле с матер. путём категории авторКатегория (id=1, parent=0) --> path='.1.' --ПодКатегория1 (id=2, parent=1) --> path='.1.2.' ----ПодКатегория категории1 (id=5, parent=2) --> path='.1.2.5.' ----ПодКатегория категории2 (id=6, parent=2) --> path='.1.2.6.' и поиск предков/чайлдов делать через него ... минус конечно есть, и большой, - этот путь нужно всё время "поддерживать" в актуальном состоянии, но поиск упрощается "донЕльзя", а на индексированном path - "летает" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.08.2013, 11:03:41
|
|||
|---|---|---|---|
|
|||
Получение id всех подкатегорий (деток) из необходимой (условно корневой) |
|||
|
#18+
Спасибо! Я примерно так и думал, сделать какое то ограничение все таки по вложенности. Но думал использовать JOIN-ы таблицы самой на себя. Пока безрезультатно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.08.2013, 11:05:03
|
|||
|---|---|---|---|
|
|||
Получение id всех подкатегорий (деток) из необходимой (условно корневой) |
|||
|
#18+
AntonSHihovСпасибо! Я примерно так и думал, сделать какое то ограничение все таки по вложенности. Но думал использовать JOIN-ы таблицы самой на себя. Пока безрезультатно. показуй ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.08.2013, 11:11:13
|
|||
|---|---|---|---|
|
|||
Получение id всех подкатегорий (деток) из необходимой (условно корневой) |
|||
|
#18+
"SELECT `id`, `name`, `count`, `price`, `category` FROM `goods` WHERE `category` IN ( SELECT `id` FROM `categories` WHERE `parent` IN ( SELECT `id` FROM `categories` WHERE `parent` =".$parent.")) ORDER BY `category`, `orderby`, `name`, `id`" вот так у меня было раньше, для уровня вложенности 3. С джоинами сейчас пробую отриосвать, пока только задумки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.08.2013, 11:18:37
|
|||
|---|---|---|---|
|
|||
Получение id всех подкатегорий (деток) из необходимой (условно корневой) |
|||
|
#18+
SELECT `id`,`name` FROM `categories` as `tabl1` LEFT JOIN `categories` as `tab2` ON `tab1`.`parent`=`tab2`.`id` where `tab1`.`parent` = 111360 Вот что то типа этого задумка, которую и пытаюсь копать, но в таком варианте ругается на id, считая его не уникальным (Column 'id' in field list is ambiguous) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.08.2013, 11:23:08
|
|||
|---|---|---|---|
|
|||
Получение id всех подкатегорий (деток) из необходимой (условно корневой) |
|||
|
#18+
AntonSHihov Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. вот так у меня было раньше, для уровня вложенности 3. С джоинами сейчас пробую отриосвать, пока только задумки так, как-то, вроде ... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. вот эту дерив.тейбд ("а") можно сделать вьюхой, и использовать в запросах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.08.2013, 21:33:02
|
|||
|---|---|---|---|
|
|||
Получение id всех подкатегорий (деток) из необходимой (условно корневой) |
|||
|
#18+
Что ты имеешь ввиду под Вьюхой? Вьюхи я только из Друпала знаю, но это с запросами там никак не связано (напрямую по крайней мере) в таком варианте не хочет работать (as упущены в запросе, проставил, все равно не заработало) Наверное придется все таки на пхп перебирать и новые запросы SQL делать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=47&mobile=1&tid=1836319]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
25ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 314ms |

| 0 / 0 |
