![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Есть таблицы
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
Неактивен