Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

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

 

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

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

тема: Select
 
 автор: Port_Artur1   (13.12.2007 в 16:36)   письмо автору
 
 

Есть таблица типа:

rub:
id, pid, name
1 0 Новости
2 1 Спорт
3 2 Гольф
4 2 Футбол
5 1 Политика
6 5 Внешняя
7 5 Внутренняя
8 1 IT-мир

news:
id, id_rub, date, text
1 8 2007-12-31 'Умер PHP4'

Как из такой таблицы вывести все рубрики в SELECT

Вот так

$result = mysql_query(" SELECT id_rubric, rubric FROM rubric") or error( mysql_error() );
while ($r = mysql_fetch_array($result))
{ if ($r['id_organization'] != $row['id_organization']){
print "<OPTION value=\"".$r['id_organization']."\">".$r['organization'];
}}



вывожу из обычной таблицы если подрубрик нет а вот если есть не пойму как ведь подрубрик пожет быть и 2 и 5 уровней. Как написать чтобы вывело все
типа
БМВ
БМВ*320
БМВ*745*руль
БМВ*745*дверь
БМВ*530*колесо
БМВ*530*колесо*гайка
БМВ*850


т.е. чтобы прошёлся скрипт по всем подрубрикам вне зависимости от разрядноcти вложений - такое возможно.

   
 
 автор: sim5   (13.12.2007 в 16:40)   письмо автору
 
   для: Port_Artur1   (13.12.2007 в 16:36)
 

Использовать рекурсивный вызов.

   
 
 автор: Port_Artur1   (13.12.2007 в 16:50)   письмо автору
 
   для: sim5   (13.12.2007 в 16:40)
 

А можно суть идеи
А то в Яндексе нашёл только определения, а шо это такое так и не понял - первый раз вообще такое слышу.

   
 
 автор: sim5   (13.12.2007 в 17:47)   письмо автору
 
   для: Port_Artur1   (13.12.2007 в 16:50)
 

Ну тогда не знаю, что и сказать, если не понимаете. Но вот так хотя бы, может это яснее будет.

PS. Вопрос (попутно) для cheops || Trianon: читал о рекурсивных запросах в SQL Server, типа:

WITH 
   tree (data, id) 
   AS (SELECT VHC_NAME, VHC_ID_FATHER
      FROM T_VEHICULE 
      WHERE VHC_NAME = 'MOTORCYCLE' 
      UNION ALL 
      SELECT VHC_NAME, VHC_ID_FATHER 
      FROM T_VEHICULE V 
          INNER JOIN tree t 
           ON t.id = V.VHC_ID) SELECT * 
FROM tree

а в MySQL подобное не планируется?

   
 
 автор: Port_Artur1   (13.12.2007 в 19:49)   письмо автору
 
   для: sim5   (13.12.2007 в 17:47)
 

Блин а можно на словах подробнее чото я не совсем точнее совсем ничегоне понял (ну бывает и такое)

   
 
 автор: sim5   (13.12.2007 в 19:52)   письмо автору
 
   для: Port_Artur1   (13.12.2007 в 19:49)
 

Если вы о статье по ссылке, то куда уж подробнее, да там и не только слова, но и пример.

   
 
 автор: Port_Artur1   (13.12.2007 в 20:21)   письмо автору
 
   для: sim5   (13.12.2007 в 19:52)
 


while($row = mysql_fetch_assoc($res)){
$tree[$row[ParentID]][$row[ID]] = $row[Title];
}


Чтобы посмотреть что же лежит в массиве можно просто выполнить print_r($tree) и будет вам счастье! Для чего я заделал $row[ID] на второй уровень? Для связи с ParentID, действуем таже как если бы мы просто выполняли запросы в рекурсии, но мы же орудуем массивами...

function ShowTree($tree, $pid=0){
echo <ul type=square>;
foreach( $tree as $id=>$root){
if($pid!=$id)continue;
if(count($root)){
foreach($root as $key => $title){
echo <li>{$title};
if(count($tree[$key]))ShowTree($tree,$key);
}
}
}
echo </ul>;
}


foreach( $tree as $id=>$root) - блин не пойму смысл массив то двухмерный что тогда $id и $root

   
 
 автор: sim5   (13.12.2007 в 20:33)   письмо автору
 
   для: Port_Artur1   (13.12.2007 в 20:21)
 

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

   
 
 автор: Port_Artur1   (13.12.2007 в 20:43)   письмо автору
 
   для: sim5   (13.12.2007 в 20:33)
 

Блин а кто может объснить?

   
 
 автор: sim5   (13.12.2007 в 20:57)   письмо автору
 
   для: Port_Artur1   (13.12.2007 в 20:43)
 

Если вы не понимаете рекурсии, делайте выборку родителей, их потомков, забирайте записи у этих потомков. Это можете сделать последовательно, это вам понятно будет?

PS. Точно, перепутал кое что, кое с чем, если еще не читали до постскрипт, не обращайте внимания, это я про себя, так как удалил немного из своего ответа. :)

   
 
 автор: Port_Artur1   (13.12.2007 в 22:10)   письмо автору
 
   для: sim5   (13.12.2007 в 20:57)
 

Функция называется рекурсивной, если во время ее обработки возникает ее повторный вызов, либо непосредственно, либо косвенно, путем цепочки вызовов других функций.

   
Rambler's Top100
вверх

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