SQL присоединиться даже нет такого идентификатора - PullRequest
0 голосов
/ 21 ноября 2011

У меня следующий запрос:

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 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 нет идентичного идентификатора?

Ответы [ 3 ]

7 голосов
/ 21 ноября 2011

Вы используете inner join, что означает, что он получит только те элементы, которые находятся в обеих таблицах.

Возможно, вы ищете left outer join.

вы действительно не понимаете, как работают объединения, здесь - хорошее визуальное представление, объясняющее это.

2 голосов
/ 21 ноября 2011
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 нет идентичного идентификатора, для такой пары будут выбраны значения NULL.

Hello - hello.png
World - NULL

Ключевые слова: LEFT и OUTER .Если вам нужна замена отсутствующих значений в таблице каталога, вы можете использовать RIGHT OUTER JOIN .Чтобы все это работало одновременно - FULL OUTER JOIN

2 голосов
/ 21 ноября 2011
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 соединение - это то, что вам нужно.Я также не понимаю, для чего предназначен внешний выбор ...

...