![]() |
|
| Правила Форума редакция от 22.06.2020 |
|
|||||||
|
|
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже. |
|
![]() |
|
|
Опции темы | Опции просмотра |
Language
|
|
|
#1
|
|
Постоялец
![]() ![]() Пол:
Регистрация: 19.10.2007
Сообщений: 272
Репутация: 4
|
Здравствуйте!
ПОдскажите как написать реккурсивную процедур, которая будет выгребать из базы данных дерево. Можно ли из этой процедуры, сделать Select. Что бв не писать большой код в скрпте php |
|
|
|
| Реклама: |
|
|
#2
|
|
Неактивный пользователь
Пол:
Регистрация: 10.06.2008
Сообщений: 86
Репутация: 22
|
__________________
<?php if ($url == "nowa.cc") echo "It's a good choice"; exit(); ?> |
|
|
|
|
|
#3
|
|
Постоялец
![]() ![]() Пол:
Регистрация: 19.10.2007
Сообщений: 272
Репутация: 4
|
К сожалению это не то. Я хочу классически организовать дерево. ID, ParentID и вытягивать реккурсивным запросом, ил процедурой все дерево. То что там предлагают не то что я хочу. Например в MS SQL 2005 уже есть рекурсивные запросы. Они реализуются черз виртуальные представления. В MySQL я пока не знаю как орагнизовать запрос или построить профудуру функцию, которая будет дерево выгребать из базы.
|
|
|
|
|
|
#4
|
|
Неактивный пользователь
Пол:
Регистрация: 10.06.2008
Сообщений: 86
Репутация: 22
|
Вот здесь информация о создании хранимых процедур в mysql http://www.cyberguru.ru/database/mys...rocedures.html .
А почему бы на php не решить данную задачу? Создание классического дерева занимает не более 10 строк кода.
__________________
<?php if ($url == "nowa.cc") echo "It's a good choice"; exit(); ?> |
|
|
|
|
|
#5
|
|
Постоялец
![]() ![]() Пол:
Регистрация: 19.10.2007
Сообщений: 272
Репутация: 4
|
Я хочу за одно обращение к базе данных извлечь дерево и обработать потом данные на PHP. А не извлекать каждый уровень дерева из базы.
К стати можно ли хранимой процедурой вернуть набор данных. |
|
|
|
|
|
#6
|
|
Постоялец
![]() ![]() Пол:
Регистрация: 19.10.2007
Сообщений: 272
Репутация: 4
|
Код:
CREATE PROCEDURE `Recursive_procedure_new`(IN param1 INTEGER(11), IN StrIn teXT, OUT StrOut TEXT)
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
Declare lStrIn, lStrOut Text;
set lStrIn = CONCAT(STRIN,'!ABS');
set StrOut = lStrIn;
set @@max_sp_recursion_depth = 256;
if (param1 <5 )Then
Call `Recursive_procedure_new`(param1+1, lStrIn, lStrOut);
set StrOut = lStrOut;
end if;
END;
Код:
CREATE PROCEDURE `Recursive_procedure_new`(IN param1 INTEGER(11), IN StrIn teXT, OUT StrOut TEXT)
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
Declare lStrIn, lStrOut Text;
set lStrIn = CONCAT(STRIN,'!ABS');
set StrOut = lStrIn;
set @@max_sp_recursion_depth = 256;
if (param1 <5 )Then
Call `Recursive_procedure_new`(param1+1, lStrIn, lStrOut);
set StrOut = lStrOut;
end if;
END;
|
|
|
|
|
|
#7
|
|
Неактивный пользователь
Регистрация: 25.08.2009
Сообщений: 1
Репутация: 0
|
тк надцать запросов это лишнее, я обычно выбираю одним запросом все из субд, а потом уже средствами пхп сортирую и строю дерево,а потом его закэшировать и вообще хорошо
![]() |
|
|
|
|
|
#8
|
|
Постоялец
![]() ![]() Пол:
Регистрация: 19.10.2007
Сообщений: 272
Репутация: 4
|
КАк ты все это отбираешь ? Все равно рекурсия должна присутствловать в запросе, если только у тебя дерево не храниться как вложенные множества, или есть дополнительная таблица, в котрой у тебя храняться расстояния от корня к каждому из узловю
|
|
|
|
|
|
#9
|
|
Постоялец
![]() ![]() Пол:
Регистрация: 19.10.2007
Сообщений: 272
Репутация: 4
|
Процедура для отбора дерева.
Код:
CREATE PROCEDURE `up_SelectTree`(IN root BIGINT)
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
declare Str text default '';
set @Parent_ID = root;
set Str = CONCAT(STR, IFNULL(@parent_id,''));
set @Query = CONCAT(
'Select * From ',
' `tbl_Tree` Where Parent_ID in (', @Parent_ID ,') order by id'
);
PREPARE select_sub_tree From @Query;
EXECUTE select_sub_tree;
DROP PREPARE select_sub_tree;
set @HTML_TEXT = '';
repeat
set @Query = CONCAT(
'Select GROUP_CONCAT(id) into @Parent_ID From ',
' `tbl_Tree` Where Parent_ID in (', @Parent_ID ,') order by id'
);
PREPARE select_sub_tree From @Query;
EXECUTE select_sub_tree;
DROP PREPARE select_sub_tree;
if NOT @Parent_ID IS NULL Then
set @Query = CONCAT(
'Select * From ',
' `tbl_Tree` Where Parent_ID in (', @Parent_ID ,') order by id'
);
PREPARE select_sub_tree From @Query;
EXECUTE select_sub_tree;
DROP PREPARE select_sub_tree;
end if;
set Str = CONCAT(STR,',', IFNULL(@Parent_ID,''));
until @Parent_ID is null end REPEAT;
END;
Код:
$UserName = 'user';
$Password = 'password';
$DB = 'DB';
$Server = 'localhost';
$LinkToDB = mysqli_init();
mysqli_real_connect($LinkToDB, $Server, $UserName, $Password) or die('Cannot connect to $Server, DB = $DB');
$Query = 'Call up_SelectTree(52)';
mysqli_select_db($LinkToDB,$DB);
$res = mysqli_real_query($LinkToDB,$Query)or die (mysqli_error($LinkToDB));
if ($res)
{
if ($result2 = mysqli_store_result($LinkToDB))
{
while ($row = mysqli_fetch_assoc($result2))
{
foreach ($row as $key => $rValue)
{
Echo "key = $key value = $rValue<BR>";
}
}
}
}
mysqli_close($LinkToDB);
|
|
|
|
|
|
#10
|
|
Неактивный пользователь
Регистрация: 20.09.2009
Сообщений: 4
Репутация: 0
|
кодом из php ?
|
|
|
|
|
|
#11
|
|
Постоялец
![]() ![]() Пол:
Регистрация: 19.10.2007
Сообщений: 272
Репутация: 4
|
Да кодом из PHP
|
|
|
|