[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка элементов дерева
artuska
Есть `таблица1` с разделами сайта. Структура — дерево id'шек и parent_id'шек, а так же, допустим, название раздела и линк.

-------------------------------
| id | p_id | name | link |
-------------------------------
| 1 | 0 |Лаптопы:| laptops|
| 2 | 1 | IBM | ibm |
| 3 | 1 | Sony | sony |
| 4 | 1 | Dell | dell |
| 5 | 3 | Vaio | vaio |
-------------------------------

Выглядит это примерно так:

Лаптопы:
• IBM
• Sony
• • Vaio
• Dell

Ну, вобщем, обычная табличка, ничего особенного.

Допустим, мы в разделе «Лаптопы». У нас есть id'шка этого раздела — «1».
Задача в том, чтобы пробежаться вглубь по этому дереву начиная от этой id'шки. Применяем рекурсию (сразу скажу — вложенность разделов небольшая, поэтому рекурсия достаточно быстро и качественно справляется, всякие там Nested Sets руки не доходит разобраться и пременить)
Вот код рекурсии (обрезанный, просто чтобы показать ход мыслей. Выводит только id'шки разделов — я вот о них-то и буду спрашивать):
Код
function output($id)
{
  $treesql = "SELECT id FROM `topics` WHERE p_id='".$id."'";
  $treeres = mysql_query($treesql);

  while($topic = mysql_fetch_object($treeres))
   {
    $str.= $topic->id.'<br />';
    $str.= output($topic->id);
    // на этой строчке у меня происходит запрос к другой таблице, в которой хранятся товары. Потом выводятся все эти товары исходя из $topic->id.
   }

  return $str;
}


Ну, здесь все просто — выведутся id'шки 2, 3, 5, 4.
Потом я беру эти id'шки и делаю другой запрос к другой таблице, выводящий все товары. И у меня выводятся все товары из раздела IBM, Sony, Sony->Vaio и Dell.
НО! Понимаете, а если у меня еще есть товары в самом разделе «Лаптопы»! Они-то не выведутся, так как выборка "SELECT id FROM `topics` WHERE p_id='".$id."'" не выдаст id'шку «1».

Так вот вопрос — как мне этим запросом (который внутри функции с рекурсией) вывести не только те id'шки, которые мы нашли, задав правило "WHERE p_id='".$id."'", но так же и родительскую id'шку?
Чтобы вывод был типа: 1, 2, 3, 5, 4.

Интересует именно SQL запрос, ну, не знаю, может там что-то с JOIN'ами сотворить или, например, выборку сделать с помощю `topics` t1 и `topics` t2...



Спустя 12 минут, 43 секунды (12.03.2008 - 16:55) artuska написал(а):
UPD: Ну, тобишь я имею ввиду, можно ли как-нибудь «прилэфтджойнить» к таблице `topics` опять эту же таблицу, только с каким нибудь хитрым заворотом в параметре ON, чтобы в вывод id'шек запрос включил не только те id'шки, которые были выбраны в параметре "WHERE p_id='".$id."'", но так же и родительскую id'шку (id'шку раздела «Лаптопы»)?

Спустя 4 часа, 51 минута, 36 секунд (12.03.2008 - 21:47) disc написал(а):
Советую почитать про "вложенные множества" (NESTED SETS)

Спустя 13 часов, 24 минуты, 16 секунд (13.03.2008 - 11:11) artuska написал(а):
Цитата
Задача в том, чтобы пробежаться вглубь по этому дереву начиная от этой id'шки. Применяем рекурсию (сразу скажу — вложенность разделов небольшая, поэтому рекурсия достаточно быстро и качественно справляется, всякие там Nested Sets руки не доходит разобраться и пременить)

Я, конечно, почитаю, но я не могу менять архитектуру базы.


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.