@vism

Можно ли оптимизировать такой запрос?

В выборку должны попасть все заказы в которых все продукты с категорией отличной от 9 доставлены
и при этом минимум один с категорией 9 не доставлен.

Тут запрос составляли изначально
Я его переделал на EXIST для ускорения и добавил недостающее условие.
Получилось это. Мне кажется можно записать это короче, посмотрите опытным взглядом пожалуйста

SELECT 
  * 
FROM
  orders 
WHERE
  EXISTS (SELECT `op`.`orders_id` 
	  FROM `orders_products` AS `op` 
	  JOIN `products` AS `p` ON `p`.`id` = `op`.`products_id` 
	  WHERE `op`.`delivery_complete` != 1 AND `p`.`category_id` = 9 AND `op`.`orders_id` = orders.id)
AND
  EXISTS (SELECT `op`.`orders_id` 
	  FROM `orders_products` AS `op` 
	  JOIN `products` AS `p` ON `p`.`id` = `op`.`products_id` 
	  WHERE ( `p`.`category_id` != 9 AND `op`.`orders_id` = orders.id ))  
AND
  NOT EXISTS (SELECT `op`.`orders_id` 
	  FROM `orders_products` AS `op` 
	  JOIN `products` AS `p` ON `p`.`id` = `op`.`products_id` 
	  WHERE ( `op`.`delivery_complete` != 1 AND `p`.`category_id` != 9 AND `op`.`orders_id` = orders.id )) 
 
ORDER BY orders.id DESC
  • Вопрос задан
  • 133 просмотра
Пригласить эксперта
Ответы на вопрос 1
@BorisKorobkov Куратор тега MySQL
Web developer
Попробуйте
SELECT `op`.`orders_id`	
FROM `orders_products` AS `op` 
JOIN `products` AS `p` ON `p`.`id` = `op`.`products_id` 
GROUP BY `op`.`orders_id`
HAVING
	MAX(`op`.`delivery_complete` != 1 AND `p`.`category_id` = 9)
	AND MAX(`p`.`category_id` != 9)
	AND NOT MAX(`op`.`delivery_complete` != 1 AND `p`.`category_id` != 9)


Но это все равно неэффективно. Правильнее триггерами обновлять 3 новых поля в orders.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы