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。很好。你的解决方案帮了我很大的忙。系统已经不让我接受了。让马克等一下。编辑:完成。再次感谢。