@bagadjan

Как переделать запрос с OR на два запроса с UNION?

Привет всем знатокам.
Для увеличения скорости ответа, поменял запрос с OR по двум столбцам на два запроса с UNION. Проблема в ORDER BY
Запрос такого вида
SELECT  p.id,
		p.url,
		p.brand_id,
		p.name,
		p.JC,
		p.annotation,
		p.body,
		p.gallery360,
		p.position,
		p.created as created,
		p.visible, 
		p.featured, 
		p.views,
		p.meta_title, 
		p.meta_keywords, 
		p.meta_description, 
		b.name as brand,
		b.url as brand_url
FROM s_products p		

LEFT JOIN s_brands b ON p.brand_id = b.id

WHERE (p.name_clear IN ('A','B') OR p.JC IN ('A','B') )
AND (SELECT count(*)>0 FROM s_variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = 1
AND p.visible=1
	
ORDER BY p.position DESC
LIMIT 0, 40


Как переписать на два запроса с Union чтобы работал ORDER BY?
  • Вопрос задан
  • 43 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Попробуйте, для начала, заменить зависимый подзапрос
AND (
  SELECT count(*)>0
  FROM s_variants pv
  WHERE pv.product_id=p.id AND pv.price>0
    AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1
) = 1
на независимый
AND p.id IN (
  SELECT product_id
  FROM s_variants
  WHERE price > 0 AND (stock IS NULL OR stock > 0)
)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
BojackHorseman
@BojackHorseman Куратор тега MySQL
...в творческом отпуске...
UNION никак не будет быстрее OR.

лучше оптимизировать оригинальный запрос. план покажите.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы