首页 > 解决方案 > 使用左连接添加 where 条件

问题描述

这里非常基本的问题。但我被 where 条件困住了,因为我知道我有多个左连接并创建了一个子表 w。

这里是mysql

with w as (SELECT t1.c1, count(DISTINCT(t3.c3)) w from t1
left join t2 on t1.c1 = t2.c2
left join t3 on t3.c3 = t2.c3
left join t4 on t4.c4 and t3.c4

where t1.c4 is true
AND t4.c5 NOT ILIKE '%XXX%'
AND t4.c5 > 0


group by 1)

SELECT
w,
count(id)

from w

group by 1
order by 1 ASC

你能帮我理解在哪里正确放置这 3 个条件,以及它会如何根据我放置它们的位置来改变结果吗?

干杯,

杰夫

标签: mysql

解决方案


当您有类似的查询时

...
FROM a LEFT JOIN b ON a.id = b.id

a无论b. _ b当值中没有对应的行时NULL。因此,当您有类似的查询时

...
FROM a LEFT JOIN b ON a.id = b.id
WHERE b.foo = 'bar'

你含蓄地说WHERE b.foo IS NOT NULL,这把你LEFT JOIN变成了一个INNER JOIN,它基本上也过滤了表a

有两种方法可以解决此问题。不那么漂亮的方式当然是

WHERE (b.foo = 'bar' OR b.foo IS NULL)

更优雅的方法是将条件也放入连接中。

FROM a LEFT JOIN b ON a.id = b.id AND b.foo = 'bar'

这样,您仍然可以从中获取每一行,a但只能从b所有条件适用的行中获取。

现在清楚了吗?


推荐阅读