Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql复杂选择查询来自4个表_Mysql - Fatal编程技术网

Mysql复杂选择查询来自4个表

Mysql复杂选择查询来自4个表,mysql,Mysql,我研究了大约200个关于mysql复杂查询的示例页面,但一直停留在其中 这是我的结构 Table name: zones zoneId | zoneName ------------------ Table name: customers customesId | zoneId | customerName ---------------------------------- Table name: products productId | productName ----------

我研究了大约200个关于mysql复杂查询的示例页面,但一直停留在其中

这是我的结构

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张唱片?我不知道为什么。有什么建议吗?逗号运算符的优先级低于显式联接运算符,而且销售也与客户相关,而不仅仅与产品相关。