【问题标题】:SQL join even there is no such idSQL join 即使没有这样的id
【发布时间】:2011-11-21 15:29:21
【问题描述】:

我有以下查询:

SELECT * FROM 
   (
       SELECT 
       catalog.*,
       images.image 
       FROM `catalog` as catalog 
       INNER JOIN `type5` as images ON catalog.id = images.id 
       WHERE catalog.left_key > (SELECT `left_key` FROM `catalog` WHERE `id`=235) AND catalog.right_key < (SELECT `right_key` FROM `catalog` WHERE `id`=235)
       ORDER BY catalog.left_key ASC
   ) ilv

此查询运行良好,但仅当表 type5 中的项目 ID 相同时,它才会从目录中选择项目。

例如在目录中我有:

id name
 5 Hello
 7 World
 8 Foo
 9 Bar

在类型 5 中,我有: 身份证图片

 5 hello.png
 8 foo.png
 9 bar.png

它只会选择

 5 Hello
 8 Foo
 9 Bar

即使 type5 中没有相同的 id,如何编辑我的查询以从目录中选择项目?

【问题讨论】:

  • 您需要的是外连接。请参阅join (sql) 上的维基百科页面。

标签: mysql sql join inner-join


【解决方案1】:

您使用的是inner join,这意味着它只会获取两个表中的项目。

您可能正在寻找left outer join

如果您并不真正了解连接的工作原理,here 是一个很好的视觉表示来解释它。

【讨论】:

    【解决方案2】:
    SELECT catalog.*, images.image 
    FROM `catalog` as catalog 
    LEFT JOIN `type5` as images 
         ON catalog.id = images.id 
    WHERE 
      catalog.left_key > 
        (SELECT `left_key` FROM `catalog` WHERE `id`=235) 
      AND catalog.right_key < 
        (SELECT `right_key` FROM `catalog` WHERE `id`=235)
    ORDER BY catalog.left_key ASC
    

    我不知道 where 子句要做什么...但是要从目录中获取所有记录以及从图像中获取目录中具有相关记录的所有记录,您需要左连接。我也不明白外部选择是做什么用的......

    【讨论】:

    • 我也不明白那个外部选择:)
    【解决方案3】:
    SELECT * FROM 
    (
       SELECT 
       catalog.*,
       images.image 
       FROM `catalog` as catalog 
       ***LEFT OUTER*** JOIN `type5` as images ON catalog.id = images.id 
       WHERE catalog.left_key > (SELECT `left_key` FROM `catalog` WHERE `id`=235) 
       AND catalog.right_key < (SELECT `right_key` FROM `catalog` WHERE `id`=235)
       ORDER BY catalog.left_key ASC
    ) ilv
    

    此查询将从与 type5 表连接的目录表中选择所有记录。如果 type5 表中没有相同的 id,则会为此类对选择 NULL 值。

    Hello - hello.png
    World - NULL
    

    关键词是LEFTOUTER。如果您需要替换目录表中的缺失值,您可以使用 RIGHT OUTER JOIN。 为了让这一切同时工作 - FULL OUTER JOIN

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 2016-06-07
      相关资源
      最近更新 更多