gpt4 book ai didi

MySQL - 项目总和问题

转载 作者:行者123 更新时间:2023-11-29 03:01:00 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com