我正在努力使这个查询正确。每次我更改它时,它都会破坏其他东西。
SELECT products.id,
products.name,
COUNT(transactions.id) AS sales,
IFNULL(SUM(cart.price_paid), 0) AS amount
FROM products
LEFT JOIN cart ON cart.product_id = products.id
LEFT JOIN transactions ON cart.transaction_id = transactions.id AND transactions.status = 'COMPLETED'
WHERE products.user_id = $id
AND products.active = 1
AND transactions.id IS NOT NULL
GROUP BY products.id
上面试图获取用户拥有的所有产品,无论他们是否有销售,然后显示它的销售。
目前,由于我有 AND transactions.id IS NOT NULL
,它不会显示所有产品。只有那些有销售的。如果我删除它,那么我将看到所有产品,但 amount
字段将不正确,因为数量将被夸大。
这些是一些基本的示例表:
# Products Table
+----+------+---------+--------+
| id | name | user_id | active |
+----+------+---------+--------+
| 1 | cup | 4 | 1 |
| 2 | ball | 4 | 1 |
+----+------+---------+--------+
# Cart Table
+----+------------+----------------+-------------+
| id | product_id | transaction_id | Price_paid |
+----+------------+----------------+-------------+
| 1 | 1 | 6 | 1.99 |
| 2 | 1 | 7 | 1.99 |
| 3 | 1 | 8 | 1.99 |
| 4 | 1 | 9 | 1.99 |
+----+------------+----------------+-------------+
# Transactions Table
+----+--------+-----------+
| ID | amount | status |
+----+--------+-----------+
| 6 | 1.99 | COMPLETED |
| 7 | 1.99 | COMPLETED |
| 8 | 2.99 | CREATED |
| 9 | 2.99 | CREATED |
+----+--------+-----------+
# Result
+----+------+-------+--------+
| id | name | sales | amount |
+----+------+-------+--------+
| 1 | Cup | 2 | 3.98 |
| 2 | Ball | 0 | 0 |
+----+------+-------+--------+
最佳答案
包含 user_id
列的 product
表非常奇怪。我可以看到购物车如何属于用户,但为什么产品属于用户?
对于您的查询,我想您只想对已售出的购物车的 price_paid
求和。如果购物车已完成交易,则视为已售出。你可以这样做:
SELECT products.id
, products.name
, COUNT(transactions.id) AS sales
, SUM(CASE WHEN transactions.id IS NOT NULL THEN cart.price_paid END) AS amount
FROM products
LEFT JOIN
cart
ON cart.product_id = products.id
LEFT JOIN
transactions
ON cart.transaction_id = transactions.id
AND transactions.status = 'COMPLETED'
WHERE products.user_id = $id
AND products.active = 1
GROUP BY
products.id
CASE
将过滤掉未完成交易的购物车的 price_paid
。
关于mysql - 如何更正此 SQL 查询? SUM 与 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29624744/