繁体   English   中英

LEFT JOIN用法有什么问题?

[英]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

如您所见,这些字段是:

  • disease_name_en
  • disease_name
  • 描述

来自LsDiseaseNameLsDiseaseName是一个包含将记录转换为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM