我对使用 LEFT JOIN 有疑问。
我有这个问题:
SELECT
LD.id AS disease_id,
LD.disease_name_en AS disease_name_en,
LDN.disease_name AS disease_name,
LDN.description AS description,
LD.image_link AS image_link
FROM LsDiseases AS LD
LEFT JOIN LsDiseaseName AS LDN
ON LDN.disease_id = LD.id
WHERE
LD.id = 1
AND
LDN.language_id = 1
返回如下输出:
disease_id disease_name_en disease_name description image_link
----------------------------------------------------------------------------------------------------------------------------------------
1 Newcastle disease Newcastle disease TEST https://firebasestorage.googleapis.com/XXX
如您所见:
来自 LsDiseaseName ,该表是包含 LsDisease 表中记录的翻译的表。
好的确有效。我使用 LEFT JOIN ,因为我的想法是:&#34;如果存在 LsDiseaseName 表的转换(对于 LsDisease 表的记录) )如果翻译不存在,这些字段将被定值,仅将信息返回到 LsDisease 表中,并且 LsDiseaseName 的前一个字段将被赋予< strong> null 值。
问题在于改变了这个WHERE子句:
LDN.language_id = 3
使用我没有翻译的语言的ID
我获取了一个空的结果集。那么,我的推理有什么不对?我错过了什么?
答案 0 :(得分:1)
在WHERE子句中放置LDN.Language_id = 3会将左连接的含义更改为内连接(因为它不允许空值)
将该子句移动到连接语句
LEFT JOIN LsDiseaseName AS LDN
ON LDN.disease_id = LD.id
AND LDN.Language_id = 3
答案 1 :(得分:1)
将此行移至左连接
LEFT JOIN LsDiseaseName AS LDN
ON LDN.disease_id = LD.id
AND LDN.language_id = 3
答案 2 :(得分:1)
实际上,首先应用连接,然后过滤id = 3
的最终结果集,这就是你得到空结果集的原因。
你应该在加入时自己进行语言过滤。
SELECT
LD.id AS disease_id,
LD.disease_name_en AS disease_name_en,
LDN.disease_name AS disease_name,
LDN.description AS description,
LD.image_link AS image_link
FROM LsDiseases AS LD
LEFT JOIN LsDiseaseName AS LDN
ON LDN.disease_id = LD.id AND LDN.Language_id = 3
WHERE
LD.id = 1