SQL连接甚至没有这样的id

时间:2011-11-21 15:29:21

标签: mysql sql join inner-join

我有以下查询:

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

此查询效果很好,但只有在表类型5中的项目ID相同时才会选择项目FROM目录。

例如在目录中我有:

id name
 5 Hello
 7 World
 8 Foo
 9 Bar

在类型5中,我有: id image

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

它只会选择

 5 Hello
 8 Foo
 9 Bar

如果在类型5中没有相同的ID,如何编辑我的查询以从目录中选择项目?

3 个答案:

答案 0 :(得分:7)

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

您可能正在寻找left outer join

如果你真的不知道联接是如何工作的,here是一个很好的视觉表现,可以解释它。

答案 1 :(得分: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子句试图做什么...但是为了从目录中获取所有记录以及从目录中的相关记录中获取所有记录,LEFT join就是您所需要的。我也不明白外部选择是什么......

答案 2 :(得分:2)

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

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