[英]What is wrong in this LEFT JOIN use?
我对使用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 , LsDiseaseName是一个包含将记录转换为LsDisease表的表。
好吧,行得通。 我用一个LEFT JOIN,因为我的想法是:“如果存在翻译成LsDiseaseName表(用于LsDisease表的记录),这些领域将进行增值,如果翻译不存在,只返回信息到LsDisease表和LsDiseaseName的前一个字段将使用空值进行赋值。
问题在于changint这个WHERE子句:
LDN.language_id = 3
使用我没有翻译语言的ID
我得到一个空的结果集。 那么,我的推理出了什么问题? 我想念什么?
在WHERE子句中放置LDN.Language_id = 3会将左联接的含义更改为内部联接(因为它不允许使用空值)
将该子句移至join语句
LEFT JOIN LsDiseaseName AS LDN
ON LDN.disease_id = LD.id
AND LDN.Language_id = 3
将此行移到左连接中
LEFT JOIN LsDiseaseName AS LDN
ON LDN.disease_id = LD.id
AND LDN.language_id = 3
实际上,首先要应用联接,然后过滤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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.