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