MySQL内部联接帮助 - 希望包含没有匹配的行

时间:2013-02-22 19:05:38

标签: mysql inner-join

我正在加入一些查询表。

(PET)

| id | owner_id |  pet_name   | size |
--------------------------------------
| 1  |    1     |   Sparky    |  L   |
| 2  |    1     |    Spot     |  L   |
| 3  |    3     |   FooFoo    |  M   |
| 4  |    3     |    Barky    |  L   |
| 5  |    3     |    Jeb      |  S   |

(OWNER)

| id |  owner_name  |
--------------------
| 1  |    Jeff      |
| 2  |   (Kathy)    |
| 3  |    Tom       |

当我像这样进行内部联接时:

SELECT 

OWNER.id, OWNER.owner_name, PET.pet_name, PET.size

FROM OWNER

INNER JOIN PET ON PET.owner_id = OWNER.id

我得到这样的结果:

| id |  owner_name  |  pet_name   | size |
------------------------------------------
| 1  |     Jeff     |   Sparky    |  L   |
| 1  |     Jeff     |    Spot     |  L   |
| 3  |     Tom      |   FooFoo    |  M   |
| 3  |     Tom      |    Barky    |  L   |
| 3  |     Tom      |    Jeb      |  S   |

Kathy 不在结果中。我理解为什么。但我希望凯西能够参与其中。 我想让所有的主人出现,无论他们是否有宠物 - 以及那些与这次加入合并的人。

如何让所有OWNER表显示PET表连接中的所有所有者 - 无论他们在PET表中是否有宠物?

谢谢大家:)

4 个答案:

答案 0 :(得分:7)

使用LEFT JOIN而不是INNER

SELECT
  OWNER.id,
  OWNER.owner_name,
  PET.pet_name,
  PET.size
FROM OWNER
  LEFT JOIN PET
    ON PET.owner_id = OWNER.id

答案 1 :(得分:4)

你需要让你的联接成为LEFT OUTER JOIN而不是INNER JOIN。

SELECT OWNER.id, OWNER.owner_name, PET.pet_name, PET.size
  FROM OWNER
  LEFT OUTER JOIN PET 
    ON PET.owner_id = OWNER.id

请记住,左外部会返回联接“左”侧的所有记录,即使在联接的“右侧”没有匹配记录,也会返回“null”值那些领域。如您所见,“内部”连接仅 返回左侧和右侧都有匹配的记录。

希望能让你朝着正确的方向前进!

答案 2 :(得分:1)

使用外部加入

SELECT 

OWNER.id, OWNER.owner_name, PET.pet_name, PET.size

FROM OWNER

Outer JOIN PET ON PET.owner_id = OWNER.id

答案 3 :(得分:1)

您正在以错误的顺序识别表格。从您想要所有结果的那个开始,然后将另一个表连接到它。这样你就可以看到主人和他们的狗,而不是狗和它们的主人。

FROM OWNER
LEFT JOIN PET
ON PET.owner_id = OWNER.id