Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не могу решить задачку с вложенными категориями.
 
 автор: Maxam   (02.03.2011 в 00:20)   письмо автору
 
 

Вот есть одна таблица, например, cats.
В ней есть поле: cat. В этом поле указывается id категории из таблицы cats.
Т.е. любая категория может вдруг стать подкатегорией.
Мне нужно создать массив, что-то вроде того:
Категория
   Подкатегория
   Подкатегория
   Подкатегория
       Подподкатегория
       Подподкатегория
   Подкатегория
Категория
   Подкатегория
   Подкатегория
   Подкатегория
       Подподкатегория
   Подкатегория
   Подкатегория
Категория
   Подкатегория


Короче мне нужно это для того, чтобы сделать вывод категорий на сайте, как на этом форуме сообщения. Деревом. Помогите, а. Не знаю как сделать. Спасибо.

  Ответить  
 
 автор: cheops   (02.03.2011 в 00:32)   письмо автору
 
   для: Maxam   (02.03.2011 в 00:20)
 

Для этого обычно используется рекурсивная функция, что-то вроде
<?php
  
function get_catalog($id 0$intent '   ')
  {
    
$id intval($id);

    
$query "SELECT * FROM cats
              WHERE cat = 
$id
              ORDER BY pos"
;
    
$cat mysql_query($query);
    if(!
cat) exit("Ошибка извлечения разделов");
    if(
mysql_num_rows($cat))
    {
      while(
$catalog mysql_fetch_array($cat))
      {
        if(!
$id) echo $catalog['name'];
        else echo 
$intent.$catalog['name'];
        
get_catalog($catalog['id'], "$intent   ");
      }
    }
  }
  
get_catalog();
?>

  Ответить  
 
 автор: Maxam   (02.03.2011 в 00:46)   письмо автору
 
   для: cheops   (02.03.2011 в 00:32)
 

Щас же попробую.

  Ответить  
 
 автор: Maxam   (02.03.2011 в 00:52)   письмо автору
 
   для: cheops   (02.03.2011 в 00:32)
 

Fatal error: Call to undefined function sql_fetch()

  Ответить  
 
 автор: Maxam   (02.03.2011 в 00:53)   письмо автору
 
   для: Maxam   (02.03.2011 в 00:52)
 

Заменил на mysql_fetch_array, вроде работает. Спасибо.
Буду проверять и экспериментировать.

  Ответить  
 
 автор: cheops   (02.03.2011 в 00:54)   письмо автору
 
   для: Maxam   (02.03.2011 в 00:52)
 

Да, тоже заметил (правил с библиотечной функции), возьмите код по-новой (эта ошибка исправлена).

  Ответить  
 
 автор: Maxam   (02.03.2011 в 01:48)   письмо автору
 
   для: cheops   (02.03.2011 в 00:54)
 

Да, да. Уже исправил. Уже работает. Очень вам благодарен!

  Ответить  
 
 автор: Maxam   (02.03.2011 в 02:45)   письмо автору
 
   для: cheops   (02.03.2011 в 00:32)
 

А можно вопрос глупый? Почему она называется рекурсивной? :)

  Ответить  
 
 автор: neadekvat   (02.03.2011 в 07:27)   письмо автору
 
   для: Maxam   (02.03.2011 в 02:45)
 

Потому что в ней есть рекурсия, т.е. вызов самой себя.

  Ответить  
 
 автор: Красная_шляпа   (02.03.2011 в 13:26)   письмо автору
 
   для: cheops   (02.03.2011 в 00:32)
 

тут запросы в цикле а у меня выбирались все значения а потом сортировались в нужном порядке

  Ответить  
 
 автор: cheops   (02.03.2011 в 13:34)   письмо автору
 
   для: Красная_шляпа   (02.03.2011 в 13:26)
 

В смысле?

  Ответить  
 
 автор: Красная_шляпа   (02.03.2011 в 13:50)   письмо автору
 
   для: cheops   (02.03.2011 в 13:34)
 

рекурсивная выборка из базы

  Ответить  
 
 автор: mihdan   (02.03.2011 в 14:24)   письмо автору
 
   для: Красная_шляпа   (02.03.2011 в 13:26)
 

А если у меня база и в ней 500.000.000 записей? Выбрать всё в массив и сортировать массив - не накладно ли?

  Ответить  
 
 автор: Trianon   (02.03.2011 в 14:41)   письмо автору
 
   для: mihdan   (02.03.2011 в 14:24)
 

Если у Вас такая база, и оновным запросом над деревом является SELECT, а не INSERT/DELETE/UPDATE, то Вы предпочтете другую схему хранения дерева. Nested Sets , вероятно.

  Ответить  
 
 автор: Maxam   (02.03.2011 в 19:32)   письмо автору
 
   для: Trianon   (02.03.2011 в 14:41)
 

Что значит "вид хранения дерева"?

  Ответить  
 
 автор: Trianon   (02.03.2011 в 19:44)   письмо автору
 
   для: Maxam   (02.03.2011 в 19:32)
 

Про вид вроде ничего не говорил.

Существует несколько методик представления иерархии данных с помощью SQL-таблицы.
Та, которую упомянули Вы - списки смежности - Adjacency Lists - не единственная.
Другая весьма популярная методика, ориентированная на слегка другие частые запросы, это - вложенные подмножества - nested sets .

[поправлено модератором]

  Ответить  
 
 автор: Красная_шляпа   (02.03.2011 в 20:38)   письмо автору
 
   для: Trianon   (02.03.2011 в 19:44)
 

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

  Ответить  
 
 автор: Trianon   (02.03.2011 в 21:21)   письмо автору
 
   для: Красная_шляпа   (02.03.2011 в 20:38)
 

книжки != ссылки

я ни на одно конкретное творение ссылок не давал.
Не то что бы я долго искал, но представление о материале - при желании - получить можно.
Если у Вас есть на примете ссылка на методический материал получше качеством - показывайте.

  Ответить  
 
 автор: Красная_шляпа   (02.03.2011 в 20:37)   письмо автору
 
   для: mihdan   (02.03.2011 в 14:24)
 

500 млн записей :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования