2014-05-15 80 views
2

我正在開發一個基於Web的報表系統,作爲一個使用MySQL和PHP的學校項目。這是我的數據庫的樣子。MySQL - 項目總和問題

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

是什麼問題?這個結果是什麼意思?它預期或你的結果上述查詢?其查詢結果爲 – underscore

+0

。我其實想要類似 –

+0

這樣的東西有什麼問題? – underscore

回答

1

你有幾個問題正在得到你正在尋找的結果。首先,您的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 

這裏是一個有用的文章,以幫助瞭解聯接:

+0

要解釋一下,當你做一個INNER JOIN時,只有當兩個表中有一行(通過連接標準連接時,它們都必須滿足)才能得到結果。在你的情況下,你想包括一些不存在的東西,以獲得零計數。因此,即使沒有賬單/賬單,您也需要獲取所有產品/賬戶的數據。這就是爲什麼你需要一個'LEFT OUTER JOIN'來包含賬單/ billitem。 – Turophile

+0

布拉沃。這正是我期待的。感謝你能這麼快回復。真的很感激它。 –

+0

但是當會有大數據時,建議使用CROSS JOIN?它不會花費太多時間嗎? –