MySQL-项目总数问题

MySQL-项目总数问题,mysql,sql,Mysql,Sql,我正在用MySQL和PHP开发一个基于web的报告系统,作为一个学校项目。这就是我的数据库的样子 +-----------------------------------------------+ | Bill | |-----------------------------------------------| | BillID (pk) | BillDate | AccID (fk) | |

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

+-----------------------------------------------+
|               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

有没有办法通过mysql查询实现这一点

要想得到你想要的结果,你还有几个问题要解决。首先,产品表和科目表之间没有直接关系,但您希望显示两者的笛卡尔乘积。可以使用交叉连接来生成所需的结果

其次,您需要对Bill和BillItem表使用外部联接,并将WHERE条件移动到联接中

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


有什么问题?这个结果意味着什么?这是预期的还是你的上述查询结果?这是我查询的结果。我真的想要像另一个表一样的东西。有什么问题吗?为什么不尝试从product表中使用left join?谢谢您的帮助。我已经找到了答案来解释,当进行内部联接时,只有当两个表中都有一行由联接条件链接时,才会得到结果,这两个表都必须满足联接条件。在您的例子中,您希望包含一个不存在的计数,以获得零计数。因此,您需要获取所有产品/账户的数据,即使没有账单/账单项目。这就是为什么需要一个左外部联接来包含bill/billitem.Bravo。这正是我想要的。谢谢你的快速回复。真的很感激。但是当有大数据的时候,是否建议使用交叉连接?它不会花费很多时间吗?是的,如果数据库中有很多记录,那么执行它会花费很多时间。但我看不到其他选择。
|-----------------------------------------------|
|   ProductName |   UserName    |    Quantity   |
|---------------|---------------|---------------|
|    Product1   |      AA       |   10          |   
|    Product2   |      AA       |   10          |       
|    Product2   |      BB       |   10          |
+---------------+---------------+---------------+
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