这是我的情况。
我有3张 table
Orders
- id status deleted
Order Lines
- related_id related_model quantity
Products
- id code price price_purchase
我想创建一个包含所有产品
的列表。 购买次数
和毛利率之和
(price - price_purchase)。它只能使用 相关模型设置为“产品”
的订单行。其次,它必须只挑选 status 设置为 'paid, processing, sent, ready_for_pickup or picked_up'
且订单未删除的订单。
这就是我想要的结果:
id | code | purchases | value
-------------------------------
1 | code1 | 7 | 57,05
2 | code2 | 122 | 254,98
3 | code3 | 0 | 0,00
这是我目前的 SQL 查询:
SELECT p.id, p.code, IFNULL(SUM(sol.quantity) , 0) as purcahses,
sum((p.price - p.price_purchase) * quantity) as value
FROM products p
LEFT JOIN shop_orders_lines sol ON sol.related_id = p.id
AND sol.related_model = 'products'
LEFT JOIN shop_orders so ON so.id = sol.order_id
WHERE so.status IN ('paid', 'processing', 'sent', 'ready_for_pickup', 'picked_up')
AND so.deleted = 0
GROUP BY p.id
它返回正确的数据。但不是所有的问题。那是我的问题。我有很多不同的方法,如子查询和其他方法,但似乎无法解决问题。我知道问题出在我的 LEFT 连接上,但不知道我的问题的解决方案。
我正在使用 MySQL Workbench。
欢迎任何帮助。
最佳答案
你的连接是错误的。在使用产品详细信息形成 LEFT JOIN 之前,您需要确定要单独考虑的订单行。内联 View 可能会有所帮助:
SELECT
p.id,
p.code,
IFNULL(SUM(ordered_item.quantity) , 0) as purchases ,
sum((p.price - p.price_purchase) * ordered_item.quantity) as value
FROM
products p
LEFT JOIN (
SELECT
sol.related_id AS related_id,
sol.quantity AS quantity
FROM
shop_orders_lines sol
INNER JOIN shop_orders so
ON so.id = sol.order_id
WHERE
so.status IN ('paid', 'processing', 'sent', 'ready_for_pickup', 'picked_up')
AND so.deleted = 0
AND sol.related_model = 'products'
) ordered_item
ON ordered_item.related_id = p.id
GROUP BY p.id
关于mysql - SQL 查询左连接 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29279857/