Mysql复杂选择查询来自4个表
我研究了大约200个关于mysql复杂查询的示例页面,但一直停留在其中 这是我的结构Mysql复杂选择查询来自4个表,mysql,Mysql,我研究了大约200个关于mysql复杂查询的示例页面,但一直停留在其中 这是我的结构 Table name: zones zoneId | zoneName ------------------ Table name: customers customesId | zoneId | customerName ---------------------------------- Table name: products productId | productName ----------
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
您可以尝试此查询
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
希望这能有所帮助。您需要将所有客户交叉加入到产品中,这样,无论销售情况如何,每个客户都可以列出所有产品
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
是的,这是可能的。虽然我不知道你为什么不想在每张唱片上都显示zonex和customerA。此外,要获得0条记录,您需要使用外部联接。看起来您需要
sum(coalesce(Amount,0))作为金额< /代码>,您需要在没有销售的情况下将每个客户交叉连接到产品来处理。认真考虑应用程序级代码中的数据显示问题。请注意OP:如果您有“代码> >区域<代码>没有客户,您需要先对区域执行交叉连接
,然后对客户执行左连接
,谢谢Juan Carlos Oropeza。不是。每个客户都有一个区域。xQbert,你能更新你在上一次评论中提到的答案吗。抱歉,很难理解这种comlepx查询。抱歉,150秒或更长时间后返回1条记录。我有50个区域,100个客户和75000个销售额。因为这个?我是说。您可能有没有客户的区域,这些区域不会出现。若查询速度较慢,请检查表上的索引和执行计划。否。所有区域都有自定义,是更改后1.26秒,谢谢。但还是1张唱片?我不知道为什么。有什么建议吗?逗号运算符的优先级低于显式联接运算符,而且销售也与客户相关,而不仅仅与产品相关。