2017-05-30 78 views
2

我研究了大約200個關於mysql複雜查詢的示例頁面,但它仍然存在。Mysql complex從4個表格中選擇查詢

這是我stucture

Table name: zones 

zoneId | zoneName 
------------------ 

Table name: customers 

customesId | zoneId | customerName 
---------------------------------- 

Table name: products 

productId | productName 
----------------------- 

Table name: sales 

sid | zoneId | customerId | productId | amount 
---------------------------------------------- 

是否有可能僅通過查詢得到下面的輸出?

zoneName | customerName | productName | amount(SUM) 
--------------------------------------------------- 
ZoneX | customerA | productName_1 | 10 
     |    | productName_2 | 0 
     |    | productName_3 | 4 
     |    | productName_4 | 0 
ZoneX | customerB | productName_1 | 7 
     |    | productName_2 | 0 
     |    | productName_3 | 4 
     |    | productName_4 | 3 
....... 

我想爲 「0」,即使客戶或產品沒有銷售

我想:

SELECT zones.zoneName 
    , customers.customerName 
    , products.productName 
    , SUM(amount) AS amount 
FROM customers 
INNER JOIN zones 
    ON customers.zoneId = zones.zoneId 
LEFT JOIN sales 
    ON customers.customerId = sales.customerId 
LEFT JOIN products 
    ON sales.productId = products.productId 
+0

是的,這是可能的。雖然我不知道你爲什麼不想在每條記錄上顯示zonex和customerA。另外爲了得到0記錄你需要使用一個外連接。 – xQbert

+0

看起來您需要'合併(Amount,0))爲Amount',並且您需要將每個客戶交叉連接到產品,以便在無銷售時處理。 – xQbert

+1

認真考慮處理應用程序級代碼中的數據顯示問題。 – Strawberry

回答

2

您需要將所有客戶交叉加入到產品中,以便每位客戶無論是否銷售都列出了所有產品。

SELECT z.zoneName 
    , c.customerName 
    , p.productName 
    , SUM(coalesce(s.amount,0)) AS amount 
FROM customers c 
INNER JOIN zones z 
    ON c.zoneId = z.zoneId 
CROSS JOIN PRODUCTS P 
LEFT JOIN sales S 
    ON c.customerId = s.customerId 
and s.productID = p.productID 
GROUP BY z.zoneName 
     , c.customerName 
     , p.productName 
+1

OP的注意事項:如果你有沒有客戶的'區域',你需要先用'CROSS JOIN'先用區域,'LEFT JOIN'用''customers' –

+0

感謝Juan Carlos Oropeza。不是。每個客戶都有區域。 xQbert,你能否更新你的回答,就像你在最後的評論中所說的那樣。對不起,它很難理解這種comlepx查詢。 – user3325207

+0

對不起,但它在150秒或更長時間後返回1條記錄。我有50個區域,100個客戶和75000個銷售額。那是什麼原因? – user3325207

0

你可以試試這個查詢

SELECT c.zoneId ,c.customesId ,c.customerName,IF(s.amount IS NULL, 0 , s.amount) 
FROM customers AS c, products AS p 
LEFT JOIN sales AS s ON s.productId = p.productId and s.customersid = c.customersid 

希望這幫助。

+0

逗號運算符的優先級比顯式連接運算符的優先級低,另外銷售額也與客戶相關,而不僅僅是產品。 – Shadow