mysql - LEFT JOIN 空值概念
问题描述
我有“产品”和“产品翻译”表。“product_translations”表有:id、product_id、locale、name 字段。
现在我想选择这样的产品和翻译:
SELECT * FROM products AS P
LEFT JOIN product_trs Ptr on P.id = Ptr.product_id
WHERE locale = 'fr'
但问题是,如果产品没有翻译(还),这些产品不会被退回。
例如,假设我的 product_translations 包含以下行:
id pr_id locale name
------------------------------
1 1 'en' 'product 1'
2 1 'fr' 'produit 1'
3 2 'en' 'product 2'
现在,如果我选择
WHERE locale = 'en'
我将得到 2 行,如果我运行查询:
WHERE locale = 'fr'
我来一排
我想总是得到 2 行。即使我没有翻译。我怎样才能做到这一点?
解决方案
您需要将子句中的条件移动where
到on
子句中:
SELECT *
FROM products P LEFT JOIN
product_trs Ptr
ON P.id = Ptr.product_id AND ptr.locale = 'fr';
否则,过滤发生在left join
--之后,locale
然后NULL
比较失败。
一般规则是过滤子句left join
中的第一个表。where
第二个(和后续)表上的过滤器进入on
子句。
推荐阅读
- python - django:当 2 个字段具有相同值时过滤查询集
- angular - 我如何在打字稿中为 Angular 5 设置 zindex
- angular - 我什么时候应该在 Angular 2+ 中使用 TS 导入类型?
- amazon-web-services - 基于 S3 触发器更新 S3 上的文件
- sql-server - 使用 SQL 参数返回“参数类型错误”
- java - Antlr3 SQL语法中无法提供宿主变量
- windows - 使用 ExtendedSubCommandsKey(和 python _winreg)的 Windows 级联上下文菜单
- c++ - 我应该使用什么信号来终止/杀死 Windows 上的应用程序?
- r - 创建具有重复条目的滞后向量
- python - 为什么 pip 从版本 10 升级到版本 18?