Убрать дубли при left join + оптимизация запроса - MySQL
Формулировка задачи:
Есть запрос:
как правильно оптимизировать? сейчас дубли отсекаются с помощью distinct(product.id) (в таблице product_to_tag может быть один товар с нескольким тегами по этому дубли получались), но мне кажется distinct и group немножко нагружают систему + как то можно избавиться от этого `p2t`.`tag_id` IN (14, 30, 37, 500) и написать по другому
SELECT COUNT(DISTINCT(product.id))
FROM `product`
JOIN `product_to_tag` `p2t` ON product.id = p2t.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 `company` ON company.id=product.company_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`.`publish` = 1 )) AND (product.id != 513568) AND (c.id = 1 OR c.parent_id = 1) AND ((`p2t`.`tag_id` IN (14, 30, 37, 500)))Решение задачи: «Убрать дубли при left join + оптимизация запроса»
textual
Листинг программы
AND`product`.`id` IN ( * SELECT product_id *FROM product_to_tag WHERE tag_id IN (14, 30, 37, 500) )
Объяснение кода листинга программы
- В коде выполняется операция
LEFT JOINмежду двумя таблицами:productиproduct_to_tag. - В скобках указаны значения, которые используются в запросе для выборки данных.
- Код фильтрует результаты запроса, оставляя только те записи, у которых значение столбца
idприсутствует в списке, полученном из таблицыproduct_to_tag. - Список значений
product_idформируется динамически на основе выборки из таблицыproduct_to_tag, гдеtag_idсоответствует одному из указанных в скобках значений. - Оператор
INпроверяет наличие каждогоproduct_idв списке значений, полученных из таблицыproduct_to_tag. - Значения
product_idберутся из столбцаidтаблицыproduct. - Результатом запроса будет выборка из таблицы
product, где значения столбцаidприсутствуют в списке, полученном из таблицыproduct_to_tag.