【问题标题】:What is wrong in this LEFT JOIN use?这个 LEFT JOIN 使用有什么问题?
【发布时间】:2018-03-21 09:16:19
【问题描述】:

我对 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_zh
  • 疾病名称
  • 说明

来自 LsDiseaseName,该表包含将记录转换为 LsDisease 表的表。

好的,它可以工作。我使用了 LEFT JOIN,因为我的想法是:“如果存在对 LsDiseaseName 表的翻译(对于 LsDisease 表的记录)这些字段将被评估,如果翻译不存在,则仅将信息返回到 LsDisease 表中,并且 LsDiseaseName 的前一个字段将被评估为 null强> 价值。

问题是改变这个 WHERE 子句:

LDN.language_id = 3

使用我没有翻译的语言的 id

我得到一个空的结果集。那么,我的推理有什么问题?我错过了什么?

【问题讨论】:

标签: mysql sql database join left-join


【解决方案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 

【讨论】:

    【解决方案2】:

    在 WHERE 子句中放置 LDN.Language_id = 3 会将左连接的含义更改为内连接(因为它不允许空值)

    将该子句移至连接语句

    LEFT JOIN LsDiseaseName                    AS LDN
          ON LDN.disease_id = LD.id
          AND LDN.Language_id = 3
    

    【讨论】:

      【解决方案3】:

      将此行移入左连接

      LEFT JOIN LsDiseaseName                    AS LDN
            ON LDN.disease_id = LD.id
            AND LDN.language_id = 3
      

      【讨论】:

        猜你喜欢
        • 2016-05-07
        • 1970-01-01
        • 2021-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多