MySQL - 项目总和问题

时间:2014-05-15 03:48:47

标签: mysql sql

我正在开发一个基于Web的报告系统,作为一个使用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查询实现这个?

1 个答案:

答案 0 :(得分:1)

您有几个问题正在进行以获得您正在寻找的结果。首先,您的ProductAccount表之间没有直接关系,但您希望显示两者的笛卡尔积。您可以使用CROSS JOIN来生成所需的结果。

其次,您需要在OUTER JOINBill表格中使用BillItem,并将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

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