2014-05-15 6 views
2

저는 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

문제가 무엇 : 여기

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 

가 이해할 수 있도록하는 유용한 문서 조인입니까? 이 결과는 무엇을 의미합니까? 위 쿼리의 예상 결과입니까? – underscore

+0

내 쿼리의 결과. 사실 다른 테이블과 같은 것을 원합니다 –

+0

그래서 무엇이 잘못 되었나요? – underscore

답변

1

찾고있는 결과를 얻으려면 몇 가지 문제가 있습니다. 먼저 ProductAccount 테이블 간에는 직접적인 관계가 없지만 둘 다의 직교 곱을 표시하려고합니다. CROSS JOIN을 사용하여 원하는 결과를 얻을 수 있습니다.

둘째, 당신은 당신의 BillBillItem 테이블과 OUTER JOIN를 사용하고 JOINWHERE 기준을 이동해야합니다.

+0

설명하기 위해 'INNER JOIN'을 할 때 두 테이블에 행이있을 때만 결과를 얻습니다 (둘 다 충족시켜야하는 조인 기준으로 연결됨). 귀하의 경우, 거기에없는 것들의 개수를 포함 시켜서 제로 카운트를 얻고 싶습니다. 따라서 청구서/청구서가 없더라도 모든 제품/계정에 대한 데이터를 가져와야합니다. 그렇기 때문에 청구서/청구서를 포함하려면 '왼쪽 외부 조인 (LEFT OUTER JOIN)'이 필요합니다. – Turophile

+0

Bravo. 이것은 내가 찾고 있었던 바로 그 것이다. 빠른 답장을 보내 주셔서 감사합니다. 정말 감사합니다. –

+0

큰 데이터가있을 때 CROSS JOIN을 사용하는 것이 좋습니다? 시간이 많이 걸리지 않을까요? –