我有“产品”和“产品翻译”表“产品翻译”表有:id、产品id、区域设置、名称字段。
现在我想选择这样的产品和翻译:
SELECT * FROM products AS P
LEFT JOIN product_trs Ptr on P.id = Ptr.product_id
WHERE locale = 'fr'
但问题是,如果产品还没有翻译,这些产品就不会被退回。
例如,假设我的产品包含以下行:
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条答案
按热度按时间ve7v8dk21#
你需要把这个条件移开
where
条款on
条款:否则,过滤将在
left join
--以及locale
那么NULL
这不符合比较。一般的规则是在
left join
进入where
条款。第二个(及后续)表上的过滤器位于on
条款。vi4fp9gy2#
当您在“where”中编写筛选器时,记录将从结果中删除,但如果您将其置于“join condition”中,则记录只是从表中筛选,而不是从结果中筛选,并返回null。所以戈登的回答是正确的。