powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Получение id всех подкатегорий (деток) из необходимой (условно корневой)
10 сообщений из 10, страница 1 из 1
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
    #38354162
AntonSHihov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется таблица содержащая 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 (далее по этим категориям будет проводиться выборка товаров из другой таблицы)
Вроде тема достаточно распространенная должна быть (для интернет магазинов думаю очень распространена) но поисковики ничего дельного кроме вышеперечисленного не предлагают.
...
Рейтинг: 0 / 0
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
    #38354184
AntonSHihov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неужели никто не сталкивался с такой проблемой? или возможно решение только посредством нескольких запросов с рекурсией на 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);
}
?>
...
Рейтинг: 0 / 0
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
    #38354194
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 - "летает"
...
Рейтинг: 0 / 0
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
    #38354196
AntonSHihov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! Я примерно так и думал, сделать какое то ограничение все таки по вложенности. Но думал использовать JOIN-ы таблицы самой на себя. Пока безрезультатно.
...
Рейтинг: 0 / 0
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
    #38354198
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonSHihovСпасибо! Я примерно так и думал, сделать какое то ограничение все таки по вложенности. Но думал использовать JOIN-ы таблицы самой на себя. Пока безрезультатно.
показуй
...
Рейтинг: 0 / 0
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
    #38354201
AntonSHihov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"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.

С джоинами сейчас пробую отриосвать, пока только задумки
...
Рейтинг: 0 / 0
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
    #38354202
AntonSHihov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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)
...
Рейтинг: 0 / 0
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
    #38354204
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntonSHihov
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
"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.

С джоинами сейчас пробую отриосвать, пока только задумки

так, как-то, вроде ...
Код: 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.
select * 
from 

(select `parent`, id, 1 as `level`
from `categories`

union all

select t2.parent, t1.id, 2
from `categories` t1 inner join `categories` t2 on t1.parent=t2.id

union all

select t3.parent, t1.id, 3
from `categories` t1 inner join `categories` t2 on t1.parent=t2.id
inner join `categories` t3 on t2.parent=t3.id

/*
union all

....и т.д.
*/
) a

where `parent`=146


вот эту дерив.тейбд ("а") можно сделать вьюхой, и использовать в запросах
...
Рейтинг: 0 / 0
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
    #38354528
AntonSHihov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что ты имеешь ввиду под Вьюхой? Вьюхи я только из Друпала знаю, но это с запросами там никак не связано (напрямую по крайней мере)

в таком варианте не хочет работать (as упущены в запросе, проставил, все равно не заработало)

Наверное придется все таки на пхп перебирать и новые запросы SQL делать
...
Рейтинг: 0 / 0
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
    #38354557
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonSHihov,

на зеркало неча пенять: sqlfiddle.com/#!2/ec776/2
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Получение id всех подкатегорий (деток) из необходимой (условно корневой)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]