Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Многоуровневая выборка данных


Автор: Serious2008 4.2.2012, 16:17
Здравствуйте. У меня есть одна проблема нужно произовдить выборку из БД. Саму БД модифицировать нельзя.
Есть таблица в ней есть столбцы id, pid, name. Мне нужно делать выборку так чтобы в имени содержалось что-то. 
Т.е. первый запрос будет что-то типа.

Код

SELECT id, name, pid FROM table WHERE MATCH (name) AGAINST ('+".$QueryString."' IN BOOLEAN MODE) and pid = 0


Потом мне нужно делать выборку такую. 
Код
SELECT id, name, pid FROM table WHERE MATCH (name) AGAINST ('+".$QueryString."' IN BOOLEAN MODE) and pid = 'id родителя'

И так до тех пор покуда не закончатся они. Но тут есть одна проблема. Мне это всё нужно будет выводить вот в таком виде
Имя родителя >> имя ребёнка 1 >> Имя ребёнка 1_1
Имя родителя >> имя ребёнка 1 >> Имя ребёнка 1_2
Имя родителя >> имя ребёнка 1 >> Имя ребёнка 1_3
Имя родителя >> имя ребёнка 2 >> Имя ребёнка 2_1
Имя родителя >> имя ребёнка 2 >> Имя ребёнка 2_2
Имя родителя_2 >> имя ребёнка 1 >> Имя ребёнка 1_1
...
Имя родителя_n >> Имя ребёнка 1 >> Имя ребёнка 1_1

Автор: krundetz 4.2.2012, 21:07
попробуй так
Код

SELECT id, name, pid 
    FROM table 
    WHERE MATCH (name) AGAINST ('+".$QueryString."' IN BOOLEAN MODE) 
        AND pid = 0 
        AND pid = (SELECT pid 
                           FROM table 
                           WHERE MATCH (name) AGAINST ('+".$QueryString."' IN BOOLEAN MODE) 
                                AND pid = 0)

Автор: $дмитрий 4.2.2012, 21:53
Код

SELECT id, name, pid 
    FROM table 
    WHERE MATCH (name) AGAINST ('+".$QueryString."' IN BOOLEAN MODE) 
        AND pid = 0 
        AND pid = (SELECT pid 
                           FROM table 
                           WHERE MATCH (name) AGAINST ('+".$QueryString."' IN BOOLEAN MODE) 
                                AND pid = 0)

Что-то не то написано
Во первых вложенный запрос должен возвращать одну строку, не более. А значит выдаст ошибку
Во вторых не однозначное условие AND pid = 0 AND pid = 'Что-то, но не ноль' никогда не будет истиным

Автор: ksnk 4.2.2012, 22:22
По моему - классическая рекурсия. 
На первой итерации ищем все релевантные с pid=0, потом у каждого найденного родителя ищем детенков... Одним запросом, imho, никак, если глубину перебора не ограничивать.

Автор: $дмитрий 4.2.2012, 22:40
Цитата

Одним запросом, imho, никак

А можно одним запросом выбрать все записи. Далее в цикле формировать нужный массив на основе рекурсии

Автор: Serious2008 5.2.2012, 01:37
Парни оно всё хорошо. Я вот к чему пришёл.
Код

$query = "SELECT id, name, pid FROM table WHERE MATCH (meta_k) AGAINST ('+".$QueryString."' IN BOOLEAN MODE)";

$result=mysql_query($query);
$cats = array();
while($cat =  mysql_fetch_assoc($result))
        $cats[$cat['pid']][] =  $cat;



function  build_tree($cats,$pid, $tmp){
if(is_array($cats) and count($cats[$pid])>0){
$tree = '<ul>';

print_r($tmp);
 foreach($cats[$pid] as $cat){
  $tree .= '<li>'.$cat['name'];
$tmp[$pid] = array ($cat['name']);
 $tree .=  build_tree($cats,$cat['id'], $tmp);
  $tree .= '</li>';         
 }
 $tree .= '</ul>';
  } 
  else return null;          
  return $tree; 
}
echo build_tree($cats,0, $tmp); 


В итоге на выходе получаю вот такое.
Код


Обрезная доска
    Доски (доска)
       Продам
       Куплю
   Доска обрезная
       Продам
       Куплю
   Доска необрезная
       Продам
       Куплю

Array
(
    [0] =&gt; Array
        (
            [0] =&gt; Обрезная доска
        )

)
Array
(
    [0] =&gt; Array
        (
            [0] =&gt; Обрезная доска
        )

    [1411] =&gt; Array
        (
            [0] =&gt; Доски (доска)
        )
)
Array
(
    [0] =&gt; Array
        (
            [0] =&gt; Обрезная доска
        )

    [1411] =&gt; Array
        (
            [0] =&gt; Доска обрезная
        )
)
Array
(
    [0] =&gt; Array
        (
            [0] =&gt; Обрезная доска
        )

    [1411] =&gt; Array
        (
            [0] =&gt; Доска необрезная
        )
)



Вот эта тема и есть решение проблемы http://forum.vingrad.ru/forum/topic-346536.html

Автор: krundetz 6.2.2012, 10:21
Цитата($дмитрий @  4.2.2012,  21:53 Найти цитируемый пост)
Во вторых не однозначное условие AND pid = 0 AND pid = 'Что-то, но не ноль' никогда не будет истиным 

совершенно точно копировал и не поменял на OR

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)