LEFT JOIN 空值概念
LEFT JOIN null values concept
我有 'products' 和 'product_translations' table。
'product_translations' table 有:
id、product_id、语言环境、名称字段。
现在我想select这样的产品和翻译:
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'
现在如果我 select 和
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
中第一个 table 的过滤器进入 where
子句。第二个(及后续)table 的过滤器进入 on
子句。
当您在“where”中编写过滤器时,记录会从结果中删除,但如果您将其置于“连接条件”中,记录只会从 table 而不是结果和 returns null 中过滤.
所以戈登的回答是正确的。
SELECT *
FROM products P LEFT JOIN
product_trs Ptr
ON P.id = Ptr.product_id AND ptr.locale = 'fr';
我有 'products' 和 'product_translations' table。 'product_translations' table 有: id、product_id、语言环境、名称字段。
现在我想select这样的产品和翻译:
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'
现在如果我 select 和
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
中第一个 table 的过滤器进入 where
子句。第二个(及后续)table 的过滤器进入 on
子句。
当您在“where”中编写过滤器时,记录会从结果中删除,但如果您将其置于“连接条件”中,记录只会从 table 而不是结果和 returns null 中过滤. 所以戈登的回答是正确的。
SELECT *
FROM products P LEFT JOIN
product_trs Ptr
ON P.id = Ptr.product_id AND ptr.locale = 'fr';