Информация Полезные SQL запросы

  • Автор темы
За время пользования PrestaShop накопилось несколько полезных запросов, которые использую до сих пор. Вот один из них.

Товары, выбранные как связанные меньше 10 раз (с учетом наличия на остатках)
SQL:
SELECT
    q.id_product_2, p.reference, pl.name, cp.id_category, sa.quantity, q.cnt
FROM
    (SELECT count(distinct pa.id_product_1) cnt, pa.id_product_2 FROM ps_accessory pa
    INNER JOIN ps_stock_available sa
    ON sa.id_product = pa.id_product_1 AND sa.id_product_attribute = 0 AND sa.quantity > 0
    GROUP BY pa.id_product_2
    HAVING cnt < 10) q
    INNER JOIN ps_product p
    ON q.id_product_2 = p.id_product AND p.active = 1
    INNER JOIN ps_stock_available sa
    ON sa.id_product = q.id_product_2 AND sa.id_product_attribute = 0 AND sa.quantity > 0
    LEFT JOIN ps_product_lang pl ON (q.id_product_2 = pl.id_product AND pl.id_shop = 1 AND pl.id_lang = 1)
    LEFT JOIN (select id_product, min(id_category) id_category  from ps_category_product where id_category > 2 group by id_product) cp ON cp.id_product = q.id_product_2
WHERE
    1=1 -- AND NOT cp.id_category = 33
ORDER BY
    q.cnt ASC

Если хотите ограничить по категории, то менять нужно здесь:
SQL:
AND NOT cp.id_category = 33
 
Дважды в неделю приходит отчет, использующий этот запрос.

Товары с остатком 0 и меньше (по заказам за посл. неделю)
SQL:
SELECT distinct
    od.product_id,
    pl.name,
    al.name AS attribute_name,
    od.product_reference,
    sa.quantity qtyOnStock
FROM ps_orders as o
    JOIN ps_order_detail as od ON (o.id_order = od.id_order)
    LEFT JOIN ps_product_lang pl ON (od.product_id = pl.id_product AND pl.id_lang = 1)
    LEFT JOIN ps_product_attribute pa ON (pa.id_product = od.product_id AND od.product_attribute_id = pa.id_product_attribute)
    LEFT JOIN ps_product_attribute_combination pac ON (pac.id_product_attribute = pa.id_product_attribute)
    LEFT JOIN ps_attribute a ON (a.id_attribute = pac.id_attribute)
    LEFT JOIN ps_attribute_lang al ON (a.id_attribute = al.id_attribute AND al.id_lang = 1)
    LEFT JOIN ps_stock_available sa ON (sa.id_product = od.product_id AND sa.id_product_attribute = IFNULL(od.product_attribute_id,0))
WHERE DATEDIFF(now(), o.date_add) <= 7
    and not o.current_state in (6, 22)
    and sa.quantity <= 0

order by od.product_id

6 и 22 это статусы отмененных заказов у меня. Выписывайте ваши.
 
Вспомнил еще за один запрос, так как как раз сегодня его использовал.

Копирование связанных товаров (accessory)
SQL:
INSERT INTO `ps_accessory` (id_product_1, id_product_2)
SELECT id_product_1, 1158
FROM `ps_accessory`
where id_product_2 = 52
Замените на свои:
1158 - айди нового товара
52 - айди старого товара

В чем суть: иногда появляется замена старому товару (например, снят с производства), но есть новый товар (аналог) и мы бы хотели чтобы во всех товарах, у которых на странице товара отображался в связанных старый товар, отображался бы новый.
 
Вспомнил еще за один запрос, так как как раз сегодня его использовал.

Копирование связанных товаров (accessory)
SQL:
INSERT INTO `ps_accessory` (id_product_1, id_product_2)
SELECT id_product_1, 1158
FROM `ps_accessory`
where id_product_2 = 52
Замените на свои:
1158 - айди нового товара
52 - айди старого товара

В чем суть: иногда появляется замена старому товару (например, снят с производства), но есть новый товар (аналог) и мы бы хотели чтобы во всех товарах, у которых на странице товара отображался в связанных старый товар, отображался бы новый.
Приветствую!
А как можно запросом выделить все характеристики товаров по определенному производителю и удалить их все (бывают часто нужно - так как характеристики бывают захламлены не нужным или дублируют друг друга и естественно в ручную по каждому товару у определенной производителя по удалять не нужные - не реально)?
Либо удалить только определенную характеристику у товаров определенного производителя?

И еще - это отдельно конечно, но я не знал в свое время - что нужно сперва в админке задать для характеристики параметр - а потом проливать и получилось куча дубляжей.
То есть в админке есть характеристика такая как: Цвет арматуры.... а в ней уже есть разные цвета и я их не прописал (думал не нужно) и в итоге я проливаю товар у которого цвет: Золотой...
Визуально ничего не видно - фильтр товаров умеет все эти дубляжи складывать в один и вроде все как хорошо - только обратил внимание на ID характеристики (новую вводил) - а там цифра 3ххххххх вместо в лучшем случае 3хх
Можно ли как то либо модулем либо запросом к базе найти дубляжи и удалить - оставив только самый первый?
 
Назад
Сверху