MySQL - 项目总和问题

标签 mysql sql

我正在使用 MySQL 和 PHP 开发一个基于网络的报告系统作为学校项目。这就是我的数据库的样子。

+-----------------------------------------------+
|               Bill                            |
|-----------------------------------------------|
|   BillID (pk) |   BillDate    |   AccID (fk)  |
|---------------|---------------|---------------|
|   1           |  xxxx-xx-xx   |   1           |   
|   2           |  xxxx-xx-xx   |   2           |       
+---------------+---------------+---------------+


+---------------------------------------------------------------+
|                 BillItem                                      |
|---------------------------------------------------------------|
|BillItemID (pk)|   Quantity    |   BillID (fk) |ProductID (fk) |
|---------------|---------------|---------------|---------------|
|   1           |         10    |       1       |       1       |   
|   2           |         10    |       1       |       2       |       
|   3           |         10            2       |       2       |
+---------------+---------------+---------------+---------------+

+-----------------------------------------------+
|                    Product                    |
|-----------------------------------------------|
| ProductID(pk) |   ProductName |     Price     |
|---------------|---------------|---------------|
|   1           |   Product1    |   XX          |
|   2           |   Product2    |   XX          |   
|   3           |   Product3    |   XX          |
+---------------+---------------+---------------+


+-------------------------------+
|            Account            |
|-------------------------------|
|   AccID(pk)   |   UserName    |
|---------------|---------------|
|   1           |   AA          |   
|   2           |   BB          |       
+---------------+---------------+

用户购买产品。系统为每个产品生成一个账单项目。一张账单可以有多个账单项目。用户可以稍后再次购买相同的元素、不同的元素或两者的组合。我想了解用户在特定时间段内从每种产品购买了多少件商品。

预期:

+-----------------------------------------------+
|   ProductName |   UserName    |    Quantity   |
|---------------|---------------|---------------|
|    Product1   |      AA       |      10       |   
|    Product2   |      AA       |      10       |       
|    Product3   |      AA       |       0       |
|    Product1   |      BB       |       0       |   
|    Product2   |      BB       |      10       |       
|    Product3   |      BB       |       0       |
+---------------+---------------+---------------+

到目前为止我的尝试:

SELECT Product.ProductName AS ProductName, 
Account.UserName AS UserName,
SUM( Billitem.Quantity ) AS Quantity
FROM billitem
INNER JOIN Product ON BillItem.ProductID = Product.ProductID
INNER JOIN Bill ON Billitem.BillID = Bill.BillID
INNER JOIN Account ON Bill.AccID = Account.AccID
WHERE Bill.BillDate >=  'xxxx-xx-xx'AND Bill.BillDate <=  'xxxx-xx-xx'
GROUP BY UserName, ProductName

结果:

|-----------------------------------------------|
|   ProductName |   UserName    |    Quantity   |
|---------------|---------------|---------------|
|    Product1   |      AA       |   10          |   
|    Product2   |      AA       |   10          |       
|    Product2   |      BB       |   10          |
+---------------+---------------+---------------+

有什么办法可以用 mysql 查询实现吗?

最佳答案

您有几个问题正在处理以获得您正在寻找的结果。首先,您在 ProductAccount 表之间没有直接关系,但您希望显示两者的笛卡尔积。您可以使用 CROSS JOIN 来产生那些想要的结果。

其次,您需要对 BillBillItem 表使用 OUTER JOIN 并移动您的 WHERE JOIN 的标准。

SELECT 
    ProductAccounts.ProductName AS ProductName, 
    ProductAccounts.UserName AS UserName,
    COALESCE(SUM(Billitem.Quantity),0) AS Quantity
FROM (
         SELECT P.ProductId, P.ProductName, A.AccId, A.UserName
         FROM Product P CROSS JOIN Account A
    ) ProductAccounts
    LEFT JOIN billitem ON BillItem.ProductID = ProductAccounts.ProductID
    LEFT JOIN Bill ON Billitem.BillID = Bill.BillID 
         AND Bill.BillDate >=  'xxxx-xx-xx'
         AND Bill.BillDate <=  'xxxx-xx-xx'
GROUP BY UserName, ProductName

这是一篇有助于理解联接的有用文章:

关于MySQL - 项目总和问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23668939/

相关文章:

php - 页面在本地主机上运行良好但无法在托管服务器上运行

mysql - Clojure JDBC : MySQL errors when creating table with composite unique constraint

sql - 在更新语法中对子查询使用内部联接

sql - BigQuery 从项目中的所有表中选择 __TABLES__?

php - 使用具有多个 WHERE 条件的准备语句更新查询

php mysql - 将 user_id 添加到 session 变量

sql - 计算来自两个不同表的两行之间的差异

sql - 如何在 SQL 中实现 "hasChildren"SELECT 语句?

mysql - 检查表中不存在集合中的哪些 ID

mysql - 有没有办法只对行中的整数求和,然后对没有整数的字符串求和