2017-05-30 75 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