首页 > 解决方案 > 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 行。即使我没有翻译。我怎样才能做到这一点?

标签: mysqlsqldatabase-design

解决方案


您需要将子句中的条件移动whereon子句中:

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子句。


推荐阅读