MySQL双LEFT OUTER JOIN

Lev*_*tna 5 mysql sql join

我有两个表格配置文件名称,配置文件表包含一些与用户相关的元数据.名称表包含配置文件可能具有的所有可能名称.

我正在尝试创建一个MYSQL查询,它将为我提供profile.age,所有配置文件的给定名称和系列名称,即使它没有给定的名称或系列名称

轮廓


    +-------+---------+
    | ID    | AGE     | 
    +-------+---------+
    | 0     |  10     |
    | 1     |  20     |
    | 2     |  30     |
    | 3     |  40     |
    +-------+---------+  


名称


    +------------+--------+--------+
    | PROFILE_ID |  TYPE  |  NAME  | 
    +------------+--------+--------+
    |      0     |   0    | Jo     |
    |      0     |   1    | Blog   |
    |      1     |   0    | Jim    |
    |      2     |   1    | Smith  |
    +------------+--------+--------+

    Type 0 = Given Name
    Type 1 = Family Name

Quert

这是我目前使用的查询.

SELECT given.name AS 'given_name', family.name AS 'family_name', profile.age
FROM profile
LEFT OUTER JOIN name given ON profile.id = given.profile_id
LEFT OUTER JOIN name family ON profile.id = family.profile_id
WHERE given.type = 0 
AND profile_id.type = 1 
LIMIT 0 , 30
Run Code Online (Sandbox Code Playgroud)

问题

这是我想要的结果


    +------------+-------------+--------+
    | GIVEN_NAME | FAMILY_NAME | ADE    |
    +------------+-------------+--------+
    | Jo         | Blog        | 10     |
    | Jim        | NULL        | 20     |
    | NULL       | Smith       | 30     |
    | NULL       | NULL        | 40     |
    +------------+-------------+--------+

然而,这是我实际得到的


    +------------+-------------+--------+
    | GIVEN_NAME | FAMILY_NAME | AGE    |
    +------------+-------------+--------+
    | Jo         | Blog        | 10     |
    +------------+-------------+--------+

根据我的理解,LEFT OUTER JOIN应返回NULL值连接.我究竟做错了什么?如何更改我的查询以返回NULL值joun?

jud*_*dda 5

一旦您WHERE在正在LEFT JOIN编辑的表上有一个子句,您将立即消除NULL行(即没有匹配的行)。因此,对于初学者,您应该将条件given.type = 0移至ON子句而不是WHERE子句中。我将假设您在WHERE条款中的其他条件存在问题。

SELECT given.name AS 'given_name', family.name AS 'family_name', profile.age
FROM profile
LEFT OUTER JOIN name given ON profile.id = given.profile_id AND given.type = 0 
LEFT OUTER JOIN name family ON profile.id = family.profile_id AND family.type = 1
LIMIT 0 , 30
Run Code Online (Sandbox Code Playgroud)


Flo*_*ita 5

您要过滤type为0或1(在where子句中),这将省略nulls.

SELECT given.name AS 'given_name', family.name AS 'family_name', profile.age
    FROM profile
    LEFT OUTER JOIN name given 
       ON profile.id = given.profile_id and given.type = 0 
    LEFT OUTER JOIN name family 
       ON profile.id = family.profile_id and profile.type = 1 
    LIMIT 0 , 30
Run Code Online (Sandbox Code Playgroud)