mysql - 使用左连接添加 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 个条件,以及它会如何根据我放置它们的位置来改变结果吗?
干杯,
杰夫
解决方案
当您有类似的查询时
...
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
所有条件适用的行中获取。
现在清楚了吗?
推荐阅读
- r - 匹配 df2 中的 df1$col1 并将 df2$col1 中的输出值匹配到 df1$col2
- flutter - 如何让渐变和资产图像协同工作?
- python - 将单个数字添加到嵌套列表
- c# - C# - 将命名变量添加到数组并更改它们的原始值(不是副本!)
- git - 在 Centos 7 上设置 Gitlab 帐户
- angular - Angular:在类型的行为主题中编辑特定元素
- python - scrapy webcrawler 关键字参数
- google-cloud-platform - 需要帮助才能以管理员身份登录 Google 服务帐户
- python - Apache Beam 将字典加载到 BigQuery
- javascript - 如何解析具有复杂嵌套和未命名数组的分页 JSON API 响应?