Выделение всех элементов в одной таблице и объединение с другой таблицей, допускающие значения NULL - PullRequest
4 голосов
/ 10 марта 2011

У меня есть требование выбрать все значения из таблицы птиц (в основном всех птиц), а затем объединить их с другой таблицей, которая отслеживает, кому нравится эта птица.

Поэтому я хочу, чтобы запрос возвратил всех птиц,и идентификаторы записей, где людям нравится эта птица.И если нет записей о том, кому нравится эта птица, тогда это поле должно быть нулевым.

Мой текущий запрос не получает нулевые значения.Вот оно:

select  bird_name, member_id 
from birds  
right join bird_likes on birds.bird_id = bird_likes.bird_id 
where member_id = 2 ;

Что можно сделать, чтобы убедиться, что каждая строка в таблице птиц отображается один раз?

Спасибо, Алекс

Ответы [ 4 ]

28 голосов
/ 10 марта 2011

вы должны использовать left join вместо right join

Разные соединения

inner join: хранить только те строки, в которых есть данные в обеих таблицах

left join: сохранить все строки левой таблицы и добавить то, что возможно из правой

right join: сохранить все строки в правой таблице и добавить то, что возможно, из левой

Левая таблица - это всегда та таблица, которую мы уже имеем, а правая - та, к которой мы присоединяемся.

Для записи существует также cross join, который соединяет каждую строку в левой таблице с каждой строкой в ​​правой таблице, но эта строка используется не очень часто.

Надеюсь, все это теперь вам понятнее:)

Исправленный запрос

select  bird_name, member_id 
from birds  
left join bird_likes on birds.bird_id = bird_likes.bird_id 
where member_id = 2;

Имейте в виду, что это предполагает, что столбец member_id находится в таблице птицы, в противном случае вы можете сохранить условие следующим образом:

select  bird_name, member_id 
from birds  
left join bird_likes on 
    birds.bird_id = bird_likes.bird_id and
    bird_likes.member_id = 2;
3 голосов
/ 10 марта 2011
SELECT bird_name, member_id
FROM birds
LEFT JOIN bird_likes ON birds.bird_id=bird_likes.bird_id AND member_id=2
2 голосов
/ 10 марта 2011

Вы хотите использовать left outer join в этом случае

select  bird_name, member_id 
from birds  
left outer join bird_likes on birds.bird_id = bird_likes.bird_id 
where member_id = 2;

Это вернет все имена птиц и 'null' для пустых лайков.

1 голос
/ 10 марта 2011

Измените ПРАВИЛЬНОЕ СОЕДИНЕНИЕ на ЛЕВОЕ СОЕДИНЕНИЕ, которое введет все birds записи независимо от того, имеют ли они отношение к bird_likes

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...