-Объясните про слово RIGHT в запросе.
SELECT distinct p.product_id AS pid, p.product_sku AS psku, p.product_thumb_image AS pimage, p.product_name AS pname, cx.category_id AS catid, floor( pp.product_price ) AS pprice, p.product_s_desc AS pintro, pp.product_currency AS currency, p.product_discount_id AS discount
FROM jos_vm_product p
RIGHT JOIN jos_vm_product_category_xref AS cx ON p.product_id = cx.product_id
RIGHT JOIN jos_vm_product_price AS pp ON pp.product_id = p.product_id
WHERE p.product_publish = "Y"
AND p.product_special = "Y"
GROUP BY pid
ORDER BY p.product_id DESC
LIMIT 15 ;
Рассмотрим простой пример
SELECT color=red]
distinct[/color] p.product_id AS pid, floor( pp.product_price ) AS pprice
FROM jos_vm_product p
RIGHT JOIN jos_vm_product_price AS pp ON pp.product_id = p.product_id
WHERE p.product_publish = "Y"
AND p.product_special = "Y"
ORDER BY p.product_id DESC
LIMIT 15 ;
Пусть в базе данных есть таблицы с таким содержимым:
таблица product Table Price
product.id product_id price
1 1 10
2
Результат запроса без RIGHT
product_id price
1 10
Результат запроса c RIGHT
product_id price
1 10
2
А если по-простому, то без RIGHT запрос выбирает 15 записей, а потом соединяет с ценой. Если для категории нет записи в таблице цена, то и товар не выводиться.
С RIGHT запрос лопатит всю базу данных, и даже если нет записей в таблице цена товар все равно выводится.
Автор компонента объяснил, что был клиент которому как раз это и нужно. Выводить товар у которого нет цены. Из-за этого клиента у всех остальных включаются тормоза. На маленькой базе это незаметно, но Ваш случай подтвердил, что проблему решать нужно. Единсвенный способ удовлетворить всех это разбить этот запрос на несколько маленьких запросов. Тут работы на полчаса - час. Если Автор захочет, то он это сделает. Лично меня устраивает и это запрос без RIGHT.
У себя я RIGHT убрал. И, кстати, если floor( pp.product_price ) заменить на Round( pp.product_price, 2 ), то копейки обрезаться не будут. Где-раньше я выложил версию компонента где это реализовано.