Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Получение id всех подкатегорий (деток) из необходимой (условно корневой) / 10 сообщений из 10, страница 1 из 1
04.08.2013, 09:17:33
    #38354162
AntonSHihov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
Имеется таблица содержащая 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
04.08.2013, 10:37:04
    #38354184
AntonSHihov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
Неужели никто не сталкивался с такой проблемой? или возможно решение только посредством нескольких запросов с рекурсией на 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
04.08.2013, 10:58:43
    #38354194
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
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
04.08.2013, 11:03:41
    #38354196
AntonSHihov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
Спасибо! Я примерно так и думал, сделать какое то ограничение все таки по вложенности. Но думал использовать JOIN-ы таблицы самой на себя. Пока безрезультатно.
...
Рейтинг: 0 / 0
04.08.2013, 11:05:03
    #38354198
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
AntonSHihovСпасибо! Я примерно так и думал, сделать какое то ограничение все таки по вложенности. Но думал использовать JOIN-ы таблицы самой на себя. Пока безрезультатно.
показуй
...
Рейтинг: 0 / 0
04.08.2013, 11:11:13
    #38354201
AntonSHihov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
"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
04.08.2013, 11:18:37
    #38354202
AntonSHihov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
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
04.08.2013, 11:23:08
    #38354204
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
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
04.08.2013, 21:33:02
    #38354528
AntonSHihov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение id всех подкатегорий (деток) из необходимой (условно корневой)
Что ты имеешь ввиду под Вьюхой? Вьюхи я только из Друпала знаю, но это с запросами там никак не связано (напрямую по крайней мере)

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

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

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


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