LEFT JOIN的使用有什么问题?

时间:2018-03-21 09:16:19

标签: mysql sql database join left-join

我对使用 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
  • 描述

来自 LsDiseaseName ,该表是包含 LsDisease 表中记录的翻译的表。

好的确有效。我使用 LEFT JOIN ,因为我的想法是:&#34;如果存在 LsDiseaseName 表的转换(对于 LsDisease 表的记录) )如果翻译不存在,这些字段将被定值,仅将信息返回到 LsDisease 表中,并且 LsDiseaseName 的前一个字段将被赋予< strong> null 值。

问题在于改变了这个WHERE子句:

LDN.language_id = 3

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

我获取了一个空的结果集。那么,我的推理有什么不对?我错过了什么?

3 个答案:

答案 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