Mysql 双左外连接 进入

Mysql 双左外连接 进入,mysql,sql,join,Mysql,Sql,Join,我有两个表profile和name,profile表包含一些与用户相关的元数据。名称表包含配置文件可能具有的所有可能名称 我正在尝试创建一个MYSQL查询,该查询将为我提供所有配置文件的profile.age、给定名称和姓氏,即使没有给定名称或姓氏 桌子 轮廓 问题 这是我想要和期望得到的结果 +------------+-------------+--------+ | GIVEN_NAME | FAMILY_NAME | ADE | +------------+----

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

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

桌子 轮廓 问题 这是我想要和期望得到的结果

+------------+-------------+--------+ | GIVEN_NAME | FAMILY_NAME | ADE | +------------+-------------+--------+ | Jo | Blog | 10 | | Jim | NULL | 20 | | NULL | Smith | 30 | | NULL | NULL | 40 | +------------+-------------+--------+ +------------+-------------+--------+ |已知姓名|姓|艾德| +------------+-------------+--------+ |Jo | Blog | 10| |吉姆|零| 20| |空|史密斯| 30| |零|零| 40| +------------+-------------+--------+ 然而,这是我真正得到的

+------------+-------------+--------+ | GIVEN_NAME | FAMILY_NAME | AGE | +------------+-------------+--------+ | Jo | Blog | 10 | +------------+-------------+--------+ +------------+-------------+--------+ |姓名|姓氏|年龄| +------------+-------------+--------+ |Jo | Blog | 10| +------------+-------------+--------+
据我所知,左外部联接应该返回空值联接。我做错了什么?如何更改查询以返回空值joun?

一旦您在一个表上有一个
WHERE
子句,而该表正被
左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

您正在将
类型
筛选为0或1(在where子句中),这将ommit
null
s

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
name
指的是名称表
年龄
参考档案表

+1,示例问题格式!我也喜欢格式化和I
+1
ed。谢谢你,你的解释帮助我理解了实际发生的事情,我现在对连接有了更好的理解。这里不应该使用Ansi连接/交叉连接,你应该使用一种适当的连接类型(即
左连接
)来获得你需要的连接。 +------------+-------------+--------+ | GIVEN_NAME | FAMILY_NAME | AGE | +------------+-------------+--------+ | Jo | Blog | 10 | +------------+-------------+--------+
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
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
SELECT N1.id, N1.name,N2.name, A3.age 
FROM name N1, name N2, age A3 
WHERE N1.id=N2.id AND N1.id=A3.id 
  AND N1.type=0   AND N2.type=1