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]   

> Без описания
dmaw
Отправлено: 14 Апреля, 2016 - 14:01:47
Post Id



Частый гость


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


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




Ребята, помогите, не могу догнать и можно ли вообще это сделать: вывести категории и подсчитать количество товаров одним запросом. По большому счёту мне не нужно знать количество товаров в категории, сам факт есть/нет. Результатом работы должен быть список категорий и возле каждой знак +/- обозначающие наличие товаров в этой категории. Кручу эти джоины, не могу понять Улыбка
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2. cats.id,
  3. cats.name,
  4. products.id AS products_count
  5. FROM cats
  6. LEFT JOIN products ON cats.id=products.cat
  7. GROUP BY cats.id ORDER BY cats.name

(Отредактировано автором: 14 Апреля, 2016 - 14:02:16)

 
 Top
Мелкий Супермодератор
Отправлено: 14 Апреля, 2016 - 14:12:11
Post Id



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


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


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




Ну раз количество не надо, то и не надо его получать.
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2. cats.id,
  3. cats.name,
  4. EXISTS (SELECT 1 FROM products WHERE cats.id=products.cat) AS products_exists
  5. FROM cats
  6. ORDER BY cats.name


Либо
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT
  2. cats.id,
  3. cats.name,
  4. (prod_exists.cat IS NOT NULL) AS products_exists
  5. FROM cats
  6. LEFT JOIN (SELECT DISTINCT cat FROM products) prod_exists ON cats.id=prod_exists.cat
  7. ORDER BY cats.name

Возможно будет быстрее.


-----
PostgreSQL DBA
 
 Top
dmaw
Отправлено: 14 Апреля, 2016 - 14:49:33
Post Id



Частый гость


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


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




Спасибо, работает, но производительность конечно один хрен с вариантом если ставлю запрос в запросе.

В базе 300 категорий/подкатегорий и 4000 товаров, страница 3-4 секунды грузится.
 
 Top
Мелкий Супермодератор
Отправлено: 14 Апреля, 2016 - 15:12:31
Post Id



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


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


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




Покажите explain и имеющиеся индексы в обеих таблицах.

На такой мелкой базе разница должна быть в миллисекундах.
(Добавление)
В общем-то, оба запроса опираются на одни и те же индексы:
в products индекс по cat
в cats индекс по name для сортировки


-----
PostgreSQL DBA
 
 Top
dmaw
Отправлено: 14 Апреля, 2016 - 23:31:55
Post Id



Частый гость


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


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




Сделал круче Улыбка

1) делаю запрос в таблицу с товарами и выбираю все id категорий в массив.
2) делаю запрос в таблицу категорий, вывожу на страницу и ищу в массиве категорий id, если он найден, то товары в этой категории есть.

Этот подход увеличил скорость в 5 раз, по крайней мере страница открывается моментально, а не через 5 сек Улыбка

Мелкий, спасибо за помощь!
P.S. Нравится мне ваш форум, люблю заходить с вопросами Улыбка
 
 Top
Folod
Отправлено: 20 Апреля, 2016 - 23:29:52
Post Id



Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Апр. 2016  


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




спасибо за предоставленную информацию!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB