Прошу помочь с двумя MySQL запросами

Asar
На сайте с 23.08.2004
Offline
334
539

Имеется многоуровненвый каталог с двумя таблицами -- конечные объекты и несколько уровней категорий над ними.

Таблица объектов -- Id, Id родителя из таблицы категорий и поля характеристик.

Таблица категорий -- Id, Id родителя из этой же таблицы и поля характеристик.

Пример:

Растения -- Деревья -- Баобабоподобные -- Дубообразные -- Дубковые -- Дубы -- Дуб обыкновенный.

Здесь Дуб обыкновенный -- конечный объект, а все остальное -- категории и подкатегории над ним.

Вопрос:

Как наиболее грамотно (если можно, то через один запрос) запросить:

1. К какой категории второго уровня (Деревья) относится объект (Дуб обыкновенный).

2. Наоборот. Какие конечные объекты (Дуб обыкновенный) относятся к категории второго уровня (Деревья).

Вроде как UNION нужен, но как именно сделать -- не догоняю...

Петр Елагин
На сайте с 21.03.2007
Offline
197
#1
Asar:
Имеется многоуровненвый каталог с двумя таблицами -- конечные объекты и несколько уровней категорий над ними.

Таблица объектов -- Id, Id родителя из таблицы категорий и поля характеристик.
Таблица категорий -- Id, Id родителя из этой же таблицы и поля характеристик.

Пример:
Растения -- Деревья -- Баобабоподобные -- Дубообразные -- Дубковые -- Дубы -- Дуб обыкновенный.
Здесь Дуб обыкновенный -- конечный объект, а все остальное -- категории и подкатегории над ним.

Вопрос:
Как наиболее грамотно (если можно, то через один запрос) запросить:
1. К какой категории второго уровня (Деревья) относится объект (Дуб обыкновенный).
2. Наоборот. Какие конечные объекты (Дуб обыкновенный) относятся к категории второго уровня (Деревья).

Вроде как UNION нужен, но как именно сделать -- не догоняю...

Это не юнионом делается.

Если быб бы оракл, то деревяшкой можно было бы.

а тут деревок не получиться. Вам на SQL.RU нужно

Dreammaker
На сайте с 20.04.2006
Offline
569
#2

вроде бы тут nested sets бы хорошо пошли, но нужно структуру таблиц менять.

xpert13
На сайте с 15.09.2008
Offline
127
#3

Копайте в сторону LEFT JOIN

Asar
На сайте с 23.08.2004
Offline
334
#4

Хм. А Left Join причем, зачем таблицу присоединять?..

D8
На сайте с 16.06.2007
Offline
74
dm8
#5

Что-то я вопрос не совсем понял, но делается это простым слиянием таблиц, тут даже LEFT JOIN прописывать не надо, т.к. это по умолчанию в синтаксисе заложено.

Т.е. делаем примерно так.: SELECT A.category FROM table_category A, table_names B WHERE A.id=B.id AND B.names='осина';

Получите название категории, .. ну если я вопрос правильно понял, и учитывая что выпил немного :)

V1
На сайте с 30.03.2006
Offline
52
#6

У вас количество вложенных категорий может быть разное, для различных объектов. Поэтому делайте в цикле несколько запросов, пока не будет найдена родительская категория.

Пример
Дуб обыкновенный. - его категория Дубы;
Дубы - родительская категория Дубковые;
....
Основная категория - Растения, т.к. родительской у неё нет.

А если хочется сделать по-умному смотрите в строну деревьев, как уже выше сказали.

embo
На сайте с 05.12.2008
Offline
24
#7

делайте это программно, имхо на mysql такого не добиться

Плавно двигаемся от сапы к статьям (http://miralinks.ru/users/registration/from:4223)
BE
На сайте с 09.07.2008
Offline
28
#8


<select name='category'>

<?
function tree($pid,$level)
{
$query = "SELECT id,name,parent FROM `categories` WHERE parent='".$pid."'";
$res = mysql_query($query);
$count=mysql_num_rows($res);

while($cat=mysql_fetch_object($res))
{
$level++;
echo "<option value='".$cat->id."' />";

for($i=0; $i<$level; $i++)
{
$tire="";

if ($level>1)
{
$tire.="-";
}
echo $tire;
}

echo $cat->name;

tree($cat->id,$level--);
}
}

tree($cid->id,'0');

?>

</select>

Выводит категории/подкатегории в select.

Думаю изменить под ваши цели не составит труда.

BlackEvil, Rest In Peace...
xpert13
На сайте с 15.09.2008
Offline
127
#9
Asar:
Хм. А Left Join причем, зачем таблицу присоединять?..

Извиняюсь, не правильно прочитал и подумал что это куча таблиц, а не одна

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий