|
|
|
| Есть таблица типа:
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ти вложений - такое возможно. | |
|
|
|
|
|
|
|
для: Port_Artur1
(13.12.2007 в 16:36)
| | Использовать рекурсивный вызов. | |
|
|
|
|
|
|
|
для: sim5
(13.12.2007 в 16:40)
| | А можно суть идеи
А то в Яндексе нашёл только определения, а шо это такое так и не понял - первый раз вообще такое слышу. | |
|
|
|
|
|
|
|
для: 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 подобное не планируется? | |
|
|
|
|
|
|
|
для: sim5
(13.12.2007 в 17:47)
| | Блин а можно на словах подробнее чото я не совсем точнее совсем ничегоне понял (ну бывает и такое) | |
|
|
|
|
|
|
|
для: Port_Artur1
(13.12.2007 в 19:49)
| | Если вы о статье по ссылке, то куда уж подробнее, да там и не только слова, но и пример. | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: Port_Artur1
(13.12.2007 в 20:21)
| | Если вы не понимаете сути рекурсивного вызова, забудтьте тогда об этом, иначе если у вас будут несколько другие данные, вы опять ничего не сможете сделать. Делайте вместо рекурсии несколько запросов к базе и стройте дерево так, как это понятно вам. | |
|
|
|
|
|
|
|
для: sim5
(13.12.2007 в 20:33)
| | Блин а кто может объснить? | |
|
|
|
|
|
|
|
для: Port_Artur1
(13.12.2007 в 20:43)
| | Если вы не понимаете рекурсии, делайте выборку родителей, их потомков, забирайте записи у этих потомков. Это можете сделать последовательно, это вам понятно будет?
PS. Точно, перепутал кое что, кое с чем, если еще не читали до постскрипт, не обращайте внимания, это я про себя, так как удалил немного из своего ответа. :) | |
|
|
|
|
|
|
|
для: sim5
(13.12.2007 в 20:57)
| | Функция называется рекурсивной, если во время ее обработки возникает ее повторный вызов, либо непосредственно, либо косвенно, путем цепочки вызовов других функций. | |
|
|
|