Mysql 双左外连接 进入
我有两个表profile和name,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| +------------+-------------+--------+Mysql 双左外连接 进入,mysql,sql,join,Mysql,Sql,Join,我有两个表profile和name,profile表包含一些与用户相关的元数据。名称表包含配置文件可能具有的所有可能名称 我正在尝试创建一个MYSQL查询,该查询将为我提供所有配置文件的profile.age、给定名称和姓氏,即使没有给定名称或姓氏 桌子 轮廓 问题 这是我想要和期望得到的结果 +------------+-------------+--------+ | GIVEN_NAME | FAMILY_NAME | ADE | +------------+----
据我所知,左外部联接应该返回空值联接。我做错了什么?如何更改查询以返回空值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子句中),这将ommitnull
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