Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многоуровневая выборка данных 
V
    Опции темы
Serious2008
Дата 4.2.2012, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Здравствуйте. У меня есть одна проблема нужно произовдить выборку из БД. Саму БД модифицировать нельзя.
Есть таблица в ней есть столбцы 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

Это сообщение отредактировал(а) Serious2008 - 4.2.2012, 16:19
PM MAIL   Вверх
krundetz
Дата 4.2.2012, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



попробуй так
Код

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)


Это сообщение отредактировал(а) krundetz - 4.2.2012, 21:09


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
$дмитрий
Дата 4.2.2012, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: 3
Всего: 45



Код

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 = 'Что-то, но не ноль' никогда не будет истиным
PM MAIL   Вверх
ksnk
Дата 4.2.2012, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
$дмитрий
Дата 4.2.2012, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: 3
Всего: 45



Цитата

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

А можно одним запросом выбрать все записи. Далее в цикле формировать нужный массив на основе рекурсии
PM MAIL   Вверх
Serious2008
Дата 5.2.2012, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Парни оно всё хорошо. Я вот к чему пришёл.
Код

$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

Это сообщение отредактировал(а) Serious2008 - 5.2.2012, 18:11
PM MAIL   Вверх
krundetz
Дата 6.2.2012, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вечный странник
***


Профиль
Группа: Завсегдатай
Сообщений: 1400
Регистрация: 14.6.2007
Где: НН(Сормово)

Репутация: 1
Всего: 69



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

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


--------------------
!цензоры - Хранитель стратегической жидкости
Группа ТГВ
Группа Нижний Новгород
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.