mysql - 如何更正此 SQL 查询? SUM 与 JOIN

标签 mysql sql

我正在努力使这个查询正确。每次我更改它时,它都会破坏其他东西。

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/

相关文章:

PHP无限子菜单,无法使用pdo获取一些 parent

php - 将动态添加的文本框的数据存储到 MySQL 表中

php - <script> 标记未在文本区域中处理

sql - 不能在数组列中使用 Where 条件

php - 如何使用AJAX获取评论系统中的当前页面ID

php - 在 codeigniter 错误 : 1066 中加入超过 2 个数据库表

PHP:从具有重复条目的数组构建 HTML 表

mysql - 检索特定月份所有新客户的 SQL 语句

mysql - 查询中列的顺序重要吗?

php - mysql - 如何将主查询值传递到子查询中的连接