почему введение параметра даты портит мой запрос?3 таблицы JOIN в MySQL - PullRequest
0 голосов
/ 04 февраля 2019

Написание отчета, который будет возвращать 3 столбца

  1. список всех простых продуктов
  2. текущие уровни запасов по каждому товару
  3. продано кол-во в указанный период по каждомутовар.Если продаж нет, тогда показывается ноль.
sku       | qty | sold qty    
product 1 | 5   | 15    
product 2 | 7   | 0    
product 3 | 0   | 15    
product 4 | 0   | 0

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

При указании периода с использованием вышеуказанной строки пропускаются SKU, в которых продажи не были указаны в указанном периоде.

sku       | qty | sold qty    
product 1 | 5   | 15    
product 3 | 0   | 15

Я хотел бы видеть все SKU, в том числе с нулевыми продажами.

SELECT 
    p.sku,
    FORMAT(s.qty, 0) AS qty,
    IFNULL(FORMAT(SUM(o.qty_invoiced), 0), 0) AS 'sold qty'
FROM
    mage_catalog_product_entity AS p
        LEFT JOIN
    mage_cataloginventory_stock_item AS s ON p.entity_id = s.product_id
        LEFT JOIN
    mage_sales_flat_order_item AS o ON p.entity_id = o.product_id
WHERE
    p.type_id = 'simple' 
       AND o.created_at BETWEEN '2018-11-01 00:00:01' AND '2019-01-31 23:59:59'
GROUP BY p.sku
ORDER BY SUM(o.qty_invoiced) DESC;

Я хотел бы видеть все SKU в столбце 1, в том числе с нулевыми продажами.Это происходит при просмотре всей истории продаж и без указания даты.Не уверен, как добавление периода даты в микс меняет результат.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Самый простой способ - переместить условие в предложение on:

SELECT p.sku,
       FORMAT(SUM(s.qty), 0) AS qty,
       COALESCE(FORMAT(SUM(o.qty_invoiced), 0), 0) AS `sold qty`
FROM mage_catalog_product_entity p LEFT JOIN
     mage_cataloginventory_stock_item s
     ON p.entity_id = s.product_id LEFT JOIN
     mage_sales_flat_order_item o
     ON p.entity_id = o.product_id AND
        o.created_at >= '2018-11-01' AND
        o.created_at < '2019-02-01'
WHERE p.type_id = 'simple' 
GROUP BY p.sku;

При изменении ключа условие на дату переносится в предложение ON.Таким образом, это не превращает внешнее объединение во внутреннее объединение.

Другие изменения:

  • Обратите внимание на изменение арифметики даты.Не используйте between с датами.В этом случае это просто грязно и пропускает две секунды вне дня - что я считаю не преднамеренным.
  • Я предпочитаю COALESCE() вместо IFNULL(), потому что COALESCE() - это стандартный SQL.
  • Что-то нужно сделать с s.qty.Либо включите его в GROUP BY, либо используйте функцию агрегирования.Я выбрал последнее, не зная, как выглядят данные.
0 голосов
/ 04 февраля 2019

Ваше условие на o.created_at в вашем предложении WHERE конвертирует LEFT JOIN в mage_sales_flat_order_item в INNER JOIN.Чтобы это исправить, переместите

AND o.created_at BETWEEN '2018-11-01 00:00:01' AND '2019-01-31 23:59:59'

из предложения WHERE в предложение ON для LEFT JOIN в mage_sales_flat_order_item

...