【问题标题】:MySQL inner join help - want to include rows where there is no matchMySQL 内部连接帮助 - 想要包含不匹配的行
【发布时间】:2013-02-22 19:05:38
【问题描述】:

我有几张表要加入查找。

(宠物)

| 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   |

(所有者)

| 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 表中是否有宠物?

谢谢大家:)

【问题讨论】:

  • 修复是 G-Nugget 建议的(以及来自 raheel shan 的答案)。将关键字INNER 替换为关键字LEFT。瞧!

标签: mysql inner-join


【解决方案1】:

使用 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

【讨论】:

    【解决方案2】:

    您需要将您的联接设为 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
    

    请记住,左 outer 会返回连接“左”侧的所有记录,即使连接的“右”侧没有匹配记录,也会返回“空”值那些字段。如您所见,“内部”联接返回左侧和右侧都有匹配项的记录。

    希望这能推动您朝着正确的方向前进!

    【讨论】:

      【解决方案3】:

      使用外部联接

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-08
          • 2011-06-16
          • 1970-01-01
          • 2018-01-23
          相关资源
          最近更新 更多