SELECT IF(t1.cprice>t1.price,1,-1)*(t1.cprice-t1.price),min(t1.rnd),t1.product_id,name,text,t2.attribute_id FROM (SELECT RAND() as rnd,pa2.product_id,pr.price,cpr.price as cprice,count(pa2.attribute_id) as quan FROM oc_product_attribute pa1 INNER JOIN oc_product_attribute pa2 ON (pa1.attribute_id = pa2.attribute_id and pa1.text = pa2.text and pa2.product_id <> pa1.product_id and pa1.language_id = pa2.language_id) INNER JOIN oc_product pr ON (pa2.product_id = pr.product_id and pr.status = 1) LEFT JOIN oc_product cpr ON (pa1.product_id = cpr.product_id)
INNER JOIN oc_product_to_category cat_source on(pa1.product_id = cat_source.product_id) INNER JOIN oc_product_to_category cat on(pa2.product_id = cat.product_id AND cat.category_id = cat_source.category_id) WHERE pa1.product_id = '2095383381' AND pa1.language_id = '1' GROUP BY cpr.product_id,pr.price,cpr.price UNION ALL SELECT RAND() as rnd,cpr.product_id,cpr.price,pr.price as cprice, 1 as quan FROM oc_product pr LEFT JOIN oc_product cpr ON (pr.product_id <> cpr.product_id and cpr.status = 1)
INNER JOIN oc_product_to_category cat_source ON (pr.product_id = cat_source.product_id) INNER JOIN oc_product_to_category cat ON (cpr.product_id = cat.product_id AND cat.category_id = cat_source.category_id) WHERE pr.product_id = '2095383381' GROUP BY cpr.product_id,pr.price,cpr.price order by quan desc) t1 INNER JOIN oc_product_to_category cat on(t1.product_id = cat.product_id) LEFT JOIN (select '' as name, '' as text, 0 as attribute_id) as t2 on (0=0) WHERE 0=0 GROUP BY IF(t1.cprice>t1.price,1,-1)*(t1.cprice-t1.price),product_id,name,text,attribute_id ORDER BY t1.rnd, t1.product_id LIMIT 4
Модуль используется на странице в трех местах. В двух есть ограничение по атрибутам и категориям. В одном (выше) нет. Стоит ограничение только "В пределах одной категории". Это попытка использования в качестве рандомных рекомендуемых. Время выполнения данного запроса составляет 15 секунд. Есть идеи?