Mysql LEFT JOIN和WHERE子句-列出所有记录,即使是值为null的记录

Mysql LEFT JOIN和WHERE子句-列出所有记录,即使是值为null的记录,mysql,left-join,where-clause,Mysql,Left Join,Where Clause,目标是在网格上显示所有卖家的列表,包括销售额和价值 即使没有销售,也应始终显示卖家列表 比如: seller | sales | value John 10 1000 Marie 20 2000 Jamie 15 1500 Arnold 0 0 Peter 0 0 为此,下一个查询可以正常工作: SELECT tsl.sellers, COUNT(ts.sale

目标是在网格上显示所有卖家的列表,包括销售额和价值

即使没有销售,也应始终显示卖家列表

比如:

seller | sales | value
 John      10      1000
 Marie     20      2000
 Jamie     15      1500
 Arnold     0         0
 Peter      0         0
为此,下一个查询可以正常工作:

 SELECT tsl.sellers, 
       COUNT(ts.sales) AS sales,
       COALESCE(SUM(ts.value),0) AS value
 FROM tab_sellers tsl
 LEFT JOIN tab_sales ts ON  tsl.id_seller = ts.seller
 GROUP BY tsl.seller    
问题是何时需要按日期范围过滤

 SELECT tsl.sellers, 
       COUNT(ts.sales) AS sales,
       COALESCE(SUM(ts.value),0) AS value
 FROM tab_sellers tsl
 LEFT JOIN tab_sales ts ON  tsl.id_seller = ts.seller
 WHERE ts.date_sale BETWEEN '2017-05-01' and '2017-07-04'
 GROUP BY tsl.seller 
考虑到只有John和Marie在该日期范围内有销售,结果是:

seller | sales | value
 John       5       500
 Marie     10      1000
seller | sales | value
 John       5       500
 Marie     10      1000
 Jamie      0         0
 Arnold     0         0
 Peter      0         0
然而,预期结果是:

seller | sales | value
 John       5       500
 Marie     10      1000
seller | sales | value
 John       5       500
 Marie     10      1000
 Jamie      0         0
 Arnold     0         0
 Peter      0         0

我很欣赏解决这个问题的方法。

将条件放在
操作中,而不是
where

请尝试以下查询:

 SELECT tsl.sellers, 
       COUNT(ts.sales) AS sales,
       COALESCE(SUM(ts.value),0) AS value
 FROM tab_sellers tsl
 LEFT JOIN tab_sales ts ON  tsl.id_seller = ts.seller AND ts.date_sale BETWEEN '2017-05-01' and '2017-07-04'
 GROUP BY tsl.seller 

希望这对您有所帮助。

另一个WHERE语句如何?LEFT JOIN返回内部联接行加上由NULL扩展的不匹配的左表行。您需要将范围条件设置为ON。@philipxy,与我的答案相同。@chiragsatapara是的,但我的标签在您发布之前已经打开了。@Bernhard谢谢您的帮助。谢谢@chirag。很好。你的解决方案帮了我很大的忙。系统已经不让我接受了。让马克等一下。编辑:完成。再次感谢。