MySQL左外连接与where子句 - 返回不匹配的行
Posted
技术标签:
【中文标题】MySQL左外连接与where子句 - 返回不匹配的行【英文标题】:MySQL left outer join with where clause - return unmatched rows 【发布时间】:2013-07-28 10:58:46 【问题描述】:我有两个表:pq 和 pe。我正在尝试在右表 (pe) 上 LEFT OUTER JOIN
左表 (pq)。
WHERE pe.uid = "12345"
)
pe.data 应该连接到每个 pq.id 行
表格如下所示:
pq:
id | data
1 | "abc"
2 | "efg"
pe:
pqid | uid | data
2 | 54321 | "uvw"
2 | 12345 | "xyz"
我可以使用以下查询将 pq.id 的前 2 行与 pe.pqid
匹配SELECT pq.id, pq.data, pe.data FROM pq
LEFT OUTER JOIN pe ON pq.id = pe.pqid
ORDER BY pq.id LIMIT 2
我明白了:
pq.id | pq.data | pe.data
1 | "abc" |
2 | "efg" | "uvw"
但是如果我像这样使用 WHERE 语句:
SELECT pq.id, pq.data, pe.data FROM pq
LEFT OUTER JOIN pe ON pq.id = pe.pqid
WHERE pe.uid='12345'
ORDER BY pq.id LIMIT 2
我只有一行匹配 pe.pqid AND pe.uid:
pq.id | pq.data | pe.data
2 | "efg" | "xyz"
因此,通过 WHERE 子句,我得到了正确的 pe.data,但没有得到没有 pq 的 pq 行。 id 匹配 pe.pqid
我需要得到这个:
pq.id | pq.data | pe.data
1 | "abc" |
2 | "efg" | "xyz"
【问题讨论】:
【参考方案1】:是的。 where
子句将左外连接变为内连接。
为什么?当没有匹配时,pe.pqid
的值是 NULL
(pe.uid
也是如此)。所以where
子句中的比较失败(几乎所有与NULL
的比较都返回NULL
,这被认为是错误的)。
解决办法是将比较移到on
子句:
SELECT pq.id, pq.data, pe.data
FROM pq LEFT OUTER JOIN
pe
ON pq.id = pe.pqid and
pe.uid='12345'
ORDER BY pq.id LIMIT 2
【讨论】:
以上是关于MySQL左外连接与where子句 - 返回不匹配的行的主要内容,如果未能解决你的问题,请参考以下文章