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 :: Помогите построить(оптимизировать) запрос и вывод меню

 PHP.SU

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


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

> Без описания
Alex_57_php
Отправлено: 07 Марта, 2014 - 16:57:19
Post Id


Новичок


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


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




Всем привет!

Мне необходимо вывести меню категорий товаров из БД. Меню трехуровневое.
Как это делаю я:
таблица (возьмем только товары для мужчин) (Отобразить)



Код:

Спойлер (Отобразить)


Вот сам результат этого творенья


-------------------------------- -------------------------------- ------

Собственно сам вопрос как все мои циклы объединить в один большой запрос и вывести результат в много мерном массиве например?

Сейчас у меня выходит до 200 запросов на одну загрузку страницы

Помогите пожалуйста

(Отредактировано автором: 07 Марта, 2014 - 16:59:25)

 
 Top
IllusionMH
Отправлено: 07 Марта, 2014 - 17:14:50
Post Id



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


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


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




Alex_57_php, так поучайте 1 запросом все результаты, а потом уже формируйте дерево на основании связей.
 
 Top
Alex_57_php
Отправлено: 07 Марта, 2014 - 18:10:21
Post Id


Новичок


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


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




IllusionMH пишет:
формируйте дерево на основании связей


Как это сделать? Я с массивами не умею работать, покажите пример если несложно
 
 Top
shum0531
Отправлено: 11 Мая, 2014 - 21:59:29
Post Id



Гость


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


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




Наверное поздно? Но может и пригодится кому.
Код из моей системы
PHP:
скопировать код в буфер обмена
  1. /*
  2. Получение sql запроса по url массиву
  3.  
  4. $table - таблица в которую идет запрос
  5. $url_array - массив из URL. Например
  6. URL = 111/222/333/444/555
  7. $url_array = Array
  8. (
  9.     [0] => 111
  10.     [1] => 222
  11.     [2] => 333
  12.     [3] => 444
  13.     [4] => 555
  14. )
  15.  
  16. */
  17. function shv_url_sql($table, $url_array) {
  18.         global $db;
  19.        
  20.         $shv_url_count = count($url_array);
  21.         $select = "SELECT l{$shv_url_count}.* FROM {$table} AS l{$shv_url_count} \r\n";
  22.        
  23.         for($left_join = '', $i = 1; $i < count($url_array); $i++)
  24.         {
  25.                 $left_join = "LEFT JOIN {$table} AS l".$i." ON l".$i.".id = l".($i+1).".parent_id AND l".$i.".name_url = '".$url_array[$i-1]."' \r\n".$left_join;
  26.         }
  27.         return $select.$left_join."WHERE l".$shv_url_count.".name_url = '".$url_array[$shv_url_count-1]."' AND l1.parent_id = '0';";
  28. }

В результате получаем SQL запрос
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT l5.* FROM pages AS l5
  2. LEFT JOIN pages AS l4 ON l4.id = l5.parent_id AND l4.name_url = '444'
  3. LEFT JOIN pages AS l3 ON l3.id = l4.parent_id AND l3.name_url = '333'
  4. LEFT JOIN pages AS l2 ON l2.id = l3.parent_id AND l2.name_url = '222'
  5. LEFT JOIN pages AS l1 ON l1.id = l2.parent_id AND l1.name_url = '111'
  6. WHERE l5.name_url = '555' AND l1.parent_id = '0';

Запрос возвращает одну строку где name_url = '555' и вся иерархия соблюдена. name_url - поле адреса страницы.

Запрос сложный, но это лучше чем за пинывать базу Радость
 
 Top
KingStar
Отправлено: 11 Мая, 2014 - 22:20:11
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


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




shum0531? что-то не в ту степь направили, причем здесь дерево с категориями, и

Цитата:
Получение sql запроса по url массиву


-----
То что программа работает, не означает что она написана правильно!
 
 Top
shum0531
Отправлено: 11 Мая, 2014 - 22:47:00
Post Id



Гость


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


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




KingStar пишет:
shum0531? что-то не в ту степь направили, причем здесь дерево с категориями, и

Цитата:
Получение sql запроса по url массиву

задача была трех уровненное меню. Да мой код не для этого решения, его нужно переделать. Все же дерево id + parent_id, не много вариантов выборки, мой пример даст понять принцип выборки одним запросом.
 
 Top
wmgodyak
Отправлено: 23 Июня, 2014 - 12:16:23
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Июнь 2014  
Откуда: Украина, Львов


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




Можна наваяти рекурсивну функцію яка сформує дерево по паренту. Тільки ліміт рекурсій в глибину поправте під себе:
PHP:
скопировать код в буфер обмена
  1.  
  2. function tree($parent_id, $i=2) {
  3.     if ($i == 0) return;
  4.     $i--;
  5.     $ar = array();
  6.     $db = DB::instance();
  7.     $r = $db->select
  8.         ("
  9.            SELECT c.id, i.name, c.isfolder
  10.            FROM content c
  11.            JOIN content_info i on c.id = i.id and  i.languages_id = 1
  12.            WHERE c.parent_id = {$parent_id}
  13.            ORDER BY id ASC"
  14.         );
  15.  
  16.     if (!empty($r))
  17.  
  18.     foreach ($r as $row)
  19.         {
  20.         $ar[] = array(
  21.             'id' => $row['id'],
  22.             'name' => $row['name'],
  23.             'children'=> array(
  24.                 ($row['isfolder'] == 1) ? tree($row['id'], $i) : ''
  25.             )
  26.         );
  27.     }
  28.     return $ar;
  29. }
  30. print_r(tree(0));
  31.  

В даному випадку функція формує дерево на основі двох таблиць. content - основна
id parent_id isfolder
1 0 1
3 1 0
4 1 0
5 1 0
6 1 0
7 1 0
8 1 0
10 0 1
Друга містить описи
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB