У меня есть 3 объекта в базе данных:
Продукты
Категории
ТоварыЗаказ
- ID
- product_id
- line_total
- sale_date
Продукты имеют отношение «многие ко многим» с категориями (со сводкой category_product), и существует отношение «один ко многим» между продуктами и элементами заказа (продукты - <элементы заказа). </p>
Продукт может иметь несколько категорий, так что, например, обувь может быть включена как в категорию мужской> обувь, так и в категорию женская> обувь и т. Д., Но когда сгруппировано название категории, все категории «обувь» будут сгруппированы вместе.
Проблема, с которой я столкнулся, состоит в том, что мой запрос для расчета продаж для каждой категории включает дублирующиеся продажи, если товар относится к нескольким категориям:
SELECT c.name,SUM(oi.line_total) AS total
FROM products p
INNER JOIN category_product cp
ON p.id = cp.product_id
INNER JOIN categories c
ON c.id = cp.category_id
LEFT JOIN orderitems oi
ON oi.product_id = p.id
WHERE oi.sale_date BETWEEN '2018-11-19 00:00:00' AND '2018-11-25 23:59:59'
GROUP BY c.name
Так, например, если продается товар за 15.99 за продукт, который продается как в мужской, так и в женской обуви, он будет считаться 31,98.
Я могу проверить, сколько раз строка включена:
SELECT oi.id ,count(oi.id) AS count
FROM products p
INNER JOIN category_product cp
ON p.id = cp.product_id
INNER JOIN categories c
ON c.id = cp.category_id
LEFT JOIN orderitems oi
ON oi.product_id = p.id
WHERE oi.sale_date BETWEEN '2018-11-19 00:00:00' AND '2018-11-25 23:59:59'
GROUP BY oi.id
Что еще хотелось бы знать, так это как ограничить включение элементов заказа в совокупность (SUM ()), чтобы получить точный показатель продаж для категорий