Задавайте вопросы, мы ответим
Вы не зашли.
Есть таблицы
product
записи
product_to_category
записи
надо сделать выборку поличество продуктов у категории по городам
то есть
у city_id = 1 по category_id = 1 => 1 продукт
у city_id = 1 по category_id = 2 => 2 продукта
Неактивен
Неактивен
чет не получается у меня количество посчитать правильно вот запрос
SELECT v.city_id, v2c.category_id, c.parent_id AS parent_category_id, v.id
FROM product v
JOIN product_to_category v2c ON v.id = v2c.product_id
JOIN category c ON v2c.category_id = c.id
JOIN city city ON v.city_id = city.id
WHERE v.publish =1 AND v.city_id =501 AND c.parent_id =10 AND v.id
IN ( SELECT product_id FROM product_to_category WHERE category_id IN ( SELECT id FROM category WHERE parent_id = c.parent_id) )
вот какой запрос без количества
результат
надо получить группировку по вакансии вот так будет и потом количество если добавить выборку уже должна быть 1 строка count = 2 чет не получается 2ку получить, а сейчас получаю 9
Отредактированно x-miller-x (29.12.2016 08:16:19)
Неактивен
select count(*) from (select ... from (ваш запрос) t2 group by .. ) t1;
но тут нужно будет упрощать, так как куча полей, выбираемых во внутренних частях для этого запроса не нужна.
Неактивен
join city убрал остальное вроде нужное или как еще оптимизировать? + если убрать вот это условие AND v.city_id =501
AND c.parent_id =10 и захочу взять по всем категориям и городам количество получить он возвращает только одну строку
Отредактированно x-miller-x (29.12.2016 10:07:54)
Неактивен
еще один момент если в таблице много записей вот этот момент жестко тормозит
v.id
IN ( SELECT product_id FROM product_to_category WHERE category_id IN ( SELECT id FROM category WHERE parent_id = c.parent_id) )
Неактивен
если "надо сделать выборку поличество продуктов у категории по городам", то подзапрос не нужен
покажите структуру таблиц в виде
show create table `имя таблицы`;
и набор тестовых данных
insert into..
и какой должен быть результат.
Неактивен
в первом посте есть структура таблицы product и product_to_category
третья таблица category, :
запрос изначально был такой
SELECT v.city_id, v2c.category_id, c.parent_id AS parent_category_id, v.id, count(*) as count FROM product v JOIN product_to_category v2c ON v.id = v2c.product_id JOIN category c ON v2c.category_id = c.id WHERE v.publish =1 AND v.id IN ( SELECT product_id FROM product_to_category WHERE category_id IN ( SELECT id FROM category WHERE parent_id = c.parent_id) ) GROUP BY v.city_id, c.parent_id
результат такой
надо сделать выборку количества по city_id, parent_category_id
примерно так, но он как то криво работает когда много записей
Отредактированно x-miller-x (29.12.2016 12:13:19)
Неактивен
у вас в запросе v2c.category_id и v.id выбираются случайным образом при группировке
"запрос изначально был такой" - это не постановка задачи. подозреваю, что запрос кривой, но я ведь не знаю, что нужно сделать.
Неактивен
вот пример с ошибкой без группировки и count(*) такой результат
у запроса
SELECT v.city_id, v2c.category_id, c.parent_id AS parent_category_id, v.id FROM product v JOIN product_to_category v2c ON v.id = v2c.product_id JOIN category c ON v2c.category_id = c.id JOIN city city ON v.city_id = city.id WHERE v.publish =1 AND v.city_id =501 AND c.parent_id =10 AND v.id IN ( SELECT product_id FROM product_to_category WHERE category_id IN ( SELECT id FROM category WHERE parent_id = c.parent_id) )
а с группировкой получается
SELECT v.city_id, v2c.category_id, c.parent_id AS parent_category_id, count(*) as count FROM product v JOIN product_to_category v2c ON v.id = v2c.product_id JOIN category c ON v2c.category_id = c.id JOIN city city ON v.city_id = city.id WHERE v.publish =1 AND v.city_id =501 AND c.parent_id =10 AND v.id IN ( SELECT product_id FROM product_to_category WHERE category_id IN ( SELECT id FROM category WHERE parent_id = c.parent_id) ) GROUP BY v.city_id, c.parent_id
получается так
а надо вместо count=9, 2 так как всего 2 продукта 9 записей
Неактивен
тогда группировку нужно делать ещё и по продукту
GROUP BY v.city_id, c.parent_id, v.id
Неактивен
пробовал получается так
Неактивен
SELECT COUNT(*) FROM (SELECT v.city_id, v2c.category_id, c.parent_id AS parent_category_id,v.id FROM product v JOIN product_to_category v2c ON v.id = v2c.product_id JOIN company_category c ON v2c.category_id = c.id WHERE v.publish =1 AND v.city_id =501 AND v.id IN ( SELECT product_id FROM product_to_category WHERE category_id IN ( SELECT id FROM company_category WHERE parent_id = c.parent_id ) ) GROUP BY v.city_id, c.parent_id, v.id) t1
так тоже не канает
Отредактированно x-miller-x (29.12.2016 13:10:56)
Неактивен
count(distinct v.id)
GROUP BY v.city_id, c.parent_id
Неактивен
ага спасибо, теперь работает корректно, еще можете подсказать как оптимизировать такой запрос
SELECT count(*) FROM `product` WHERE ((((`product`.`id` in ( select product_id from product_to_city join city on (city.id = product_to_city.city_id) where city.id = 1 or city.parent_id = 1 )))) AND (`product`.`publish` = 1 AND (`product`.`delete` = 0 OR `product`.`delete` is null))) AND (product.id in (select product_id from product_to_category where category_id in (select id from category where parent_id in (11))))
p.s. индексы все расставлены
переписал на exists но тут вот эта часть медленно выполняется
select product_id from product_to_city join city on (city.id = product_to_city.city_id) where city.id = 1 or city.parent_id = 1
в таблице product_to_city 1,3 млн записей
Отредактированно x-miller-x (30.12.2016 14:07:10)
Неактивен
показывайте структуру и план запроса
Неактивен
SELECT `product`.`id`, `product`.`name`, `product`.`condition`, `product`.`city_id`, `product`.`price`,`user`.`name` AS `user_name`, `city`.`name` AS `city_name` FROM `product_to_category` `p2c` JOIN `product` `product` ON product.id = p2c.product_id LEFT JOIN `city` `city` ON city.id=product.city_id LEFT JOIN `user` ON user.id=product.user_id WHERE ( ((`product`.`id` in ( select product_id from product_to_city join city on (city.id = product_to_city.city_id) where city.id = 1 or city.parent_id = 1 ))) AND ( (`product`.`zombie` = 0)) AND (`product`.`publish` = 1 AND (`product`.`delete` = 0 OR `product`.`delete` is null))) GROUP BY `product`.`id` HAVING COUNT(1) > 1 ORDER BY `product`.`timestamp_update` DESC
таблица продукт
таблица city
таблица category
таблица product_to_category
таблица user
таблица product_to_city
explain
Неактивен
пока так лучше стало, если есть предложения слушаю )
SELECT `product`.`id`, `product`.`name`, `product`.`condition`, `product`.`city_id`, `product`.`price`,`user`.`name` AS `user_name`, `city`.`name` AS `city_name` FROM `product_to_category` `p2c` JOIN `product` `product` ON product.id = p2c.product_id JOIN product_to_city ptc ON product.id = ptc.product_id JOIN city c ON c.id = ptc.city_id LEFT JOIN `city` `city` ON city.id=product.city_id LEFT JOIN `user` ON user.id=product.user_id WHERE ( ((`product`.`id` in ( select product_id from product_to_city join city on (city.id = product_to_city.city_id) where city.id = 1 or city.parent_id = 1 ))) AND ( (`product`.`zombie` = 0)) AND (`product`.`publish` = 1 AND `product`.`archive` = 0 AND (`product`.`delete` = 0 OR `product`.`delete` is null))) GROUP BY `product`.`id` HAVING COUNT(1) > 1 ORDER BY `product`.`timestamp_update` DESC
Отредактированно x-miller-x (06.02.2017 14:35:35)
Неактивен
Этот запрос занимает где то 20 секунд когда нагрузки нет, во время нагрузки еще больше, можете подсказать как оптимизировать? Структуру приводил ранее http://sqlinfo.ru/forum/viewtopic.php?pid=44509#p44760
Неактивен