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 :: Помогите разобраться (MySQL запрос)

 PHP.SU

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


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

> Описание: как сделать 1-2 запроса вместо ~100 =)
ZeiZ
Отправлено: 15 Апреля, 2010 - 11:58:26
Post Id



Частый гость


Покинул форум
Сообщений всего: 231
Дата рег-ции: Нояб. 2009  
Откуда: Москва


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




Добрый день.

Есть 2 таблицы:
1) category: id, name, ......
2) podcategory: id, category_id, name, .....

Нужно вывести что-то типа:
1) category1
1.1)podcategory1
1.2)podcategory2
1.3)podcategory3
1.N)podcategoryN

2)category2
2.1)podcategory1
2.2)podcategory2
2.3)podcategory3
2.N)podcategoryN
N)categoryN
N.1)podcategory1
N.2)podcategory2
N.3)podcategory3
N.NpodcategoryN
........................

Сейчас работает так:
PHP:
скопировать код в буфер обмена
  1.  
  2. while ($cat = mysql_fetch_array($result))
  3. {
  4.      
  5.      echo($cat['name']);
  6.      ......
  7.      while ($podcat = mysql_fetch_array($result))
  8.      {
  9.            echo($podacat['name']);
  10.      }
  11. }
  12.  


Категорий не много и их число не увеличится (16)
Подкатегорий не может быть больше 6
16*6=max 96 запросов к БД.
Знаю, что так НЕ ДЕЛАЮТ, но вот как?
 
 Top
JustUserR
Отправлено: 15 Апреля, 2010 - 16:29:43
Post Id



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


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


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




ZeiZ пишет:
16*6=max 96 запросов к БД Знаю, что так НЕ ДЕЛАЮТ, но вот как
Все зависит от того что в конечном итоге вы хотите получить - если просто вывести список подкатегорий то делаете один большой запрос с JOIN-ом вроде следующего SELECT a.ID,a.category_id,a_name,b.ID,b.name FROM pogkatogory a RIGHT JOIN caterogy b ON a.caterogy_id=b.ID и получить одну большую таблицу со всеми категориями и подкатегориями
С другой стороны если содержимое подкатегорий будет разрастаться - то вы можете выводить не сразу весь список а делать запросы от клиента через Iframe/AJAX и выводить только нужный раздел


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
ZeiZ
Отправлено: 15 Апреля, 2010 - 20:59:47
Post Id



Частый гость


Покинул форум
Сообщений всего: 231
Дата рег-ции: Нояб. 2009  
Откуда: Москва


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




да большую категорию я получаю...
..... cat_name podcat_name .....
монитор ЭЛТ
монитор ЖК
принтер лазерный
принтер матричный =)
принтер промышленный
принтер струйный
................................ ......................

Нужно вывести что-то типа:
1) category1
1.1)podcategory1
1.2)podcategory2
1.3)podcategory3
1.N)podcategoryN

2)category2
2.1)podcategory1
2.2)podcategory2
2.3)podcategory3
2.N)podcategoryN
N)categoryN
N.1)podcategory1
N.2)podcategory2
N.3)podcategory3
N.NpodcategoryN

как? спасибо!
 
 Top
Acuna
Отправлено: 15 Апреля, 2010 - 21:26:20
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Июль 2008  


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




RIGHT JOIN подошел-бы в этой ситуации, но для него требуется две таблицы. Все можно сделать намного проще вообще с одной таблицей с помощью функции обратного вызова. Она и используется для создания деревьев. Создай помимо id еще колонку parent_id.

Общий код будет примерно таким:

PHP:
скопировать код в буфер обмена
  1. $cat_menu = '<ul>';
  2.  
  3. $query = mysql_query ('SELECT * FROM category');
  4.  
  5. while ($row = mysql_fetch_array ($query)) {
  6.  
  7. if ($row['parent_id'] == '0') {
  8.  
  9. $cat_menu .= subcat ($row['id'], $row); // Обратный вызов
  10.  
  11. }
  12.  
  13. $cat_menu .= '</ul></div>';
  14.  
  15. }


И сама функция subcat:

PHP:
скопировать код в буфер обмена
  1. function subcat_menu ($id, $what) {
  2.  
  3. foreach ($what as $cats) {
  4.  
  5. if ($cats['parent_id'] == $id) {
  6.  
  7. $cat_menu .= '<li>'.$cats['name'].'</li>';
  8.                
  9. }
  10.                
  11. }
  12.  
  13. $subcategory = '<li>'.$what[$id]['title'];
  14.  
  15. if ($cat_menu) $subcategory .= '<ul>'.$cat_menu.'</ul>';
  16.                
  17. $subcategory .= '</li>';
  18.  
  19. return $subcategory;
  20.                
  21. }


Суть в том, что значение parent_id = 0 означает корневую категорию. Все остальные значения - дочернии категории этой категории. Ну например, твоя категория podcategory2 имеет id 5. Дочерней категорией category2 она будет тогда, когда ее parent_id будет иметь значение 5.

Писал экспромтом, но вроде должно работать...

(Отредактировано автором: 15 Апреля, 2010 - 21:34:22)



-----
The Lisalover
!!! I LOVE PHP !!!
 
 Top
ZeiZ
Отправлено: 15 Апреля, 2010 - 21:33:00
Post Id



Частый гость


Покинул форум
Сообщений всего: 231
Дата рег-ции: Нояб. 2009  
Откуда: Москва


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




Acuna
Списибо, немного не то. Как организовать дерево с неограниченной вложенностью в mysql я немного понимаю, но вот у меня уже жёстко заданы 2 таблицы. =((
В одну слить не получится, т.к. к категориям и подкатегориям разные требования. =((
 
 Top
Acuna
Отправлено: 15 Апреля, 2010 - 21:43:45
Post Id



Гость


Покинул форум
Сообщений всего: 87
Дата рег-ции: Июль 2008  


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




Попробуй тогда LEFT JOIN:

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM categories LEFT JOIN subcategories ON categories.id = subcategories.parent_id


-----
The Lisalover
!!! I LOVE PHP !!!
 
 Top
ZeiZ
Отправлено: 15 Апреля, 2010 - 22:01:22
Post Id



Частый гость


Покинул форум
Сообщений всего: 231
Дата рег-ции: Нояб. 2009  
Откуда: Москва


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




завтра попробую отпишусь Acuna спасибо.
 
 Top
JustUserR
Отправлено: 16 Апреля, 2010 - 13:12:39
Post Id



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


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


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




Acuna пишет:
RIGHT JOIN подошел-бы в этой ситуации, но для него требуется две таблицы. Все можно сделать намного проще вообще с одной таблицей с помощью функции обратного вызова. Она и используется для создания деревьев. Создай помимо id еще колонку parent_id
Как я понял читая первое сообщение автора у нег имеется как раз две таблицы - в одной из них содержатся катерогии с прилегающим о них данными - а в другой подкатегории также с прилегающей инофрмацией и связью с родительской категорией
ZeiZ пишет:
Есть 2 таблицы:
1) category: id, name, ......
2) podcategory: id, category_id, name, .....

Далее предложенный SQL-запрос выдается результирующую таблицу - в которой имеются все категории и их подкатегории Запрос происходит по схеме один ко многим - одна категория и много подкатегорий Из полученной таблицы надо попросту выгрузить в общий список (По сути хеш-массив) имена категорий и ссылку на родительский элемент После этого остается лишь сформироватб дерево элементов с помощью этой фукнции http://forum.php.su/topic.php?fo...65891#1271165891


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 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