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
Форумы портала PHP.SU :: Версия для печати :: Вывести категории и подсчитать количество товаров одним запросом
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Вывести категории и подсчитать количество товаров одним запросом

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

1. dmaw - 14 Апреля, 2016 - 14:01:47 - перейти к сообщению
Ребята, помогите, не могу догнать и можно ли вообще это сделать: вывести категории и подсчитать количество товаров одним запросом. По большому счёту мне не нужно знать количество товаров в категории, сам факт есть/нет. Результатом работы должен быть список категорий и возле каждой знак +/- обозначающие наличие товаров в этой категории. Кручу эти джоины, не могу понять Улыбка
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
2. Мелкий - 14 Апреля, 2016 - 14:12:11 - перейти к сообщению
Ну раз количество не надо, то и не надо его получать.
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

Возможно будет быстрее.
3. dmaw - 14 Апреля, 2016 - 14:49:33 - перейти к сообщению
Спасибо, работает, но производительность конечно один хрен с вариантом если ставлю запрос в запросе.

В базе 300 категорий/подкатегорий и 4000 товаров, страница 3-4 секунды грузится.
4. Мелкий - 14 Апреля, 2016 - 15:12:31 - перейти к сообщению
Покажите explain и имеющиеся индексы в обеих таблицах.

На такой мелкой базе разница должна быть в миллисекундах.
(Добавление)
В общем-то, оба запроса опираются на одни и те же индексы:
в products индекс по cat
в cats индекс по name для сортировки
5. dmaw - 14 Апреля, 2016 - 23:31:55 - перейти к сообщению
Сделал круче Улыбка

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

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

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

 

Powered by ExBB FM 1.0 RC1