Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите отобразить результаты SQL запроса в виде 3-уровневого списка

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
nofx
Отправлено: 20 Апреля, 2011 - 01:03:13
Post Id


Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Янв. 2011  


Помог: 0 раз(а)




Итак, есть моя MySQL база:

-школьники-
CODE (SQL):
скопировать код в буфер обмена
  1. TABLE schkolnik (
  2.   id_schkolnik int(11),
  3.   name varchar(40) ,
  4.   id_school int(11) ,
  5.   id_rukovod int(11) ,
  6.   PRIMARY KEY ( id_schkolnik )
  7. );


-их наставники-
CODE (SQL):
скопировать код в буфер обмена
  1.  TABLE rukovod (
  2.  id_rukovod int(11),
  3.  name varchar(10),
  4. PRIMARY KEY (id_rukovod)
  5. );


-заказы (школьников на новости Радость )-
CODE (SQL):
скопировать код в буфер обмена
  1. TABLE orders (
  2.   id_order  int(11) ,
  3.   id_schkolnik int(11),
  4.   id_news int(11),
  5.   PRIMARY KEY (`id_order`)
  6. );


-новости-
CODE (SQL):
скопировать код в буфер обмена
  1. TABLE news (
  2.   id_news int(11),
  3.   adress text ,
  4.   PRIMARY KEY (`id_news`)
  5. );


Есть запрос (выводит подписчиков на новость № 5 )
$query =
CODE (SQL):
скопировать код в буфер обмена
  1. "SELECT *
  2. FROM schkolnik
  3. WHERE id_schkolnik
  4. IN (
  5.  
  6. SELECT id_schkolnik
  7. FROM orders
  8. WHERE id_news =5
  9. ORDER BY id_rukovod ASC
  10. )
  11. ORDER BY id_school ASC"
  12.  


Выводит этот запрос типа такого:
Цитата:
----------------------------------------------------------------------------
id_schkolnik--------name-------- ------id_school-------------id_r ukovod
1---------------------ivan1--------------1--------------------------1
2---------------------ivan2----- ---------1---------------------- ----1
3 --------------------ivan3------- -------1------------------------ --2
4---------------------ivan4--------------2--------------------------3
5---------------------ivan5----- ---------2---------------------- ----3
--------------------------------------------------------------------------------------


Возможно ли обработать этот запрос скриптом - php для его отображения в таком виде (в виде трехуровневого списка)???:


id_shool 1
--id_rukovod 1
------id_schkolnik 1
------id_schkolnik 2
--id_rukovod 2
------id_schkolnik 3
id_shool 2
--id_rukovod 3
------id_schkolnik 4
------id_schkolnik 5

Нужно формировать дерево из возвращаемого запросом массива? Не могу ничего придумать ...

(Отредактировано автором: 20 Апреля, 2011 - 01:18:40)

 
 Top
OrmaJever Модератор
Отправлено: 20 Апреля, 2011 - 01:53:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




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


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
nofx
Отправлено: 20 Апреля, 2011 - 16:39:45
Post Id


Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Янв. 2011  


Помог: 0 раз(а)




Знаю, но такие методы построения основываются на $id - идентификаторе раздела и $pid - идентификаторе родительского раздела, а таких полей в моей БД просто нету

Пробую это сделать по такой придуманной схеме:

1)делаю запрос по школам c группировкой (GROUP BY) и формирую массив $one[], который содержит отобранные школы (это будет 1-ый уровень)

2)делаю запрос по школьникам ,из него формирую двумерный массив $two[]

То есть массив в массиве:
$two = array("id_school" => array ( "name"=> имя школьника));

3) как-то отобразить массивы в циклах, типа такого:
PHP:
скопировать код в буфер обмена
  1.     for(....){
  2.         echo $one[i];
  3.             for(...){
  4.                 echo $two[i][name];
  5. }}


Вот.....По пункту 2 никак не могу правильно заполнить двумерный массив $two значениями из результата SQL запроса чтобы он был такого вида:

PHP:
скопировать код в буфер обмена
  1. $two = array ("1" => array ("name" => ivan1), "2" => array ("name" => ivan2),...);

(Отредактировано автором: 20 Апреля, 2011 - 18:06:41)

 
 Top
nofx
Отправлено: 20 Апреля, 2011 - 19:43:23
Post Id


Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Янв. 2011  


Помог: 0 раз(а)




Вроде получилось, список выводится как я хотел.Привожу код ( только он "быдлокодовский и непонятный" как-то модно говорить , так что извиняюсь - я новичок):
PHP:
скопировать код в буфер обмена
  1.  
  2. //запрос формирует группы школ по экскурсии с id_news
  3. $result_school = mysql_query("SELECT school,id_school FROM school WHERE id_school in          
  4. (SELECT id_school FROM schkolnik WHERE id_schkolnik in
  5. (SELECT id_schkolnik FROM orders WHERE id_news = 5) GROUP BY id_school)");
  6.  
  7. //запись в массив каждой школы
  8. while ($row_school = mysql_fetch_array($result_school))
  9.          {
  10.  $one[]=array("id_school"=>$row_school[id_school], "school"=>$row_school[school]);
  11.          }
  12.  
  13. //запрос формирует школьников для каждой группы школ по экскурсии с id_news
  14. $result_schkolnik = mysql_query("SELECT fam, name, otchestvo,id_school FROM schkolnik WHERE id_school in
  15. (SELECT id_school FROM schkolnik WHERE id_schkolnik in
  16. (SELECT id_schkolnik FROM orders WHERE id_news = 5)
  17. GROUP BY id_school)
  18. ORDER BY id_school asc");
  19.  
  20.  //запись в массивы школьников для каждой id_school
  21.  
  22. while ($row_schkolnik = mysql_fetch_array($result_schkolnik))
  23.                 {
  24. //формируем двумерный массив $two [номер][фамилия.имя.отчество]
  25.                        
  26.         $two[] =array("fam" => $row_schkolnik[fam],
  27.                                    "name" => $row_schkolnik[name],
  28.                        "otchestvo"=> $row_schkolnik[otchestvo],
  29.                       "id_school" => $row_schkolnik[id_school]);
  30.  
  31.                         }
  32.  
  33. $n1=0;$n2=0; //n1,n2 - нумерация
  34. for ($i=0; $i<count($one); $i++)
  35.            {
  36.         $n1++;
  37.               echo $n1.'-'.$one[$i]["school"].'</br>';
  38.    //выводим школьников этой школы, то есть $two[$i][id_school]==$one[$i][id_school]
  39.         for($j=0; $j<count($two); $j++)
  40.                         {
  41.                        if($two[$j]["id_school"]==$one[$i]["id_school"])
  42.                                 {
  43.                                 $n2++;
  44.                                 echo '__'.$n2.'-'.$two[$j]["fam"].'</br>';
  45.                                 }
  46.                         }
  47.        }
  48.  
 
 Top
OrmaJever Модератор
Отправлено: 20 Апреля, 2011 - 21:18:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




nofx пишет:
а таких полей в моей БД просто нету

Значит не верная структура бд и нужно ещё подумать как её оптимизировать.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
nofx
Отправлено: 20 Апреля, 2011 - 21:29:08
Post Id


Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Янв. 2011  


Помог: 0 раз(а)




хотите сказать, какую бы информацию и чего бы только базы данных не хранили ( заказы, покупки, деньги, транзакции, атомные виды оружия, запчасти) разумеется с первичными и вторичными ключами , но... без идентификаторов на родительские каталоги ( ну нету их - каталогов), имеют не верную структуру?

(Отредактировано автором: 20 Апреля, 2011 - 21:31:08)

 
 Top
OrmaJever Модератор
Отправлено: 20 Апреля, 2011 - 21:46:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Ладно рекурсия дело не лёгкое поэтому попытался накунуть функцию из примера под ваш запрос. Только я не могу проверить поэтому это только для наглядности.
Оставил коментарии.
PHP:
скопировать код в буфер обмена
  1. function tree($id, $c){
  2.         $arr = array('id_scool' => 'id_rukovod', 'id_rukovod' => 'id_schkolnik');  // создаём масив (дальше будет понятно зачем)
  3.  
  4.         $query = mysql_query("SELECT * FROM `schkolnik` WHERE `{$c}` = '{$id}'") // В запросе $c это колонка по которой сортировать, $id значение этой колонки
  5.  
  6.         while($categ = mysql_fetch_object($query)){
  7.  
  8.                 echo $categ->{$c}; // выводит колонку с именем которое передали во 2 параметре
  9.                 echo "<br>\n";
  10.                 if(isset($arr[$c])) tree($categ->{$c}, $arr[$c]); // если мы не упёрлись в конец масива (тоесть не id_schkolnik) то
  11.                 // вызываем рекурсию с текущим ид но сортировать уже будем по следуйщей колонке из масива
  12.                 // если сортировали по школе то теперь будем по преподавателю, если по препод. то дальше по ученикам.
  13.         }
  14. }
  15. tree(1, 'id_scool');

(Добавление)
nofx пишет:
хотите сказать, какую бы информацию и чего бы только базы данных не хранили ( заказы, покупки, деньги, транзакции, атомные виды оружия, запчасти) разумеется с первичными и вторичными ключами , но... без идентификаторов на родительские каталоги ( ну нету их - каталогов), имеют не верную структуру?

Нет извините я просто не читал первый пост просто подумал что если вы написали что у вас нету таких полей то значит не верная структура, но потом увидел первую таблицу и понял что верно
CODE (SQL):
скопировать код в буфер обмена
  1. TABLE schkolnik (
  2.   id_schkolnik int(11),
  3.   name varchar(40) ,
  4.   id_school int(11) ,
  5.   id_rukovod int(11) ,
  6.   PRIMARY KEY ( id_schkolnik )
  7. );


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
nofx
Отправлено: 21 Апреля, 2011 - 13:45:21
Post Id


Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Янв. 2011  


Помог: 0 раз(а)




даже не соображу как оно работает )

массив $arr заполнен статически? то есть он не меняется при каждом вызове функции?

(Отредактировано автором: 21 Апреля, 2011 - 13:53:18)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB