MySQL使用where子句保留外连接 - 返回不匹配的行

Xeo*_*eos 15 mysql sql join left-join

我有两张桌子:pqpe.我想把LEFT OUTER JOIN桌子(pq)留在右边的桌子(pe)上.

  • pq具有主键列id
  • pe有两列主键,所以它可能有很多pqid或者没有
  • pe .uid列必须用于仅提取相关数据(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"
Run Code Online (Sandbox Code Playgroud)

我可以使用以下查询将pq .id的前两行与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
Run Code Online (Sandbox Code Playgroud)

我明白了:

pq.id | pq.data |  pe.data
1     | "abc"   |  
2     | "efg"   |  "uvw"
Run Code Online (Sandbox Code Playgroud)

但是如果我像这样使用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
Run Code Online (Sandbox Code Playgroud)

我只得到一行匹配pe .pqid AND pe .uid:

pq.id | pq.data |  pe.data
2     | "efg"   |  "xyz"
Run Code Online (Sandbox Code Playgroud)

所以使用WHERE子句我得到了正确的pe .data,但我没有得到没有匹配pe .pqid的pq .id的pq

我需要得到这个:

pq.id | pq.data |  pe.data
1     | "abc"   |  
2     | "efg"   |  "xyz"
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 40

是.该where子句将左外连接转换为内连接.

为什么?没有匹配时的值pe.pqidNULL(按原样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
Run Code Online (Sandbox Code Playgroud)