2010-03-31 4 views
4

У меня есть две таблицы:объединения таблиц, сохраняя при этом нулевые значения

  • пользователей: ID, first_name, last_name
  • сети: user_id, friend_id, статус

Я хочу, чтобы выбрать все значения из таблицы users, но я хочу отобразить статус конкретного пользователя (скажем, с id = 2), а остальные - NULL. Например: Если у меня есть пользователи:

? first_name last_name 
------------------------ 
1 John  Smith 
2 Tom   Summers 
3 Amy   Wilson 

И в сетях:

user_id friend_id status 
------------------------------ 
2   1   friends 

Я хочу, чтобы сделать поиск для Джона Смита для всех остальных пользователей, так что я хочу получить:

id first_name last_name status 
------------------------------------ 
2 Tom   Summers  friends 
3 Amy   Wilson  NULL 

Я пробовал делать LEFT JOIN, а затем WHERE, но это не сработало, потому что оно исключило строки, которые имеют отношения с другими пользователями, но не с этим пользователем.

Я могу сделать это с помощью заявления UNION, но мне было интересно, возможно ли это сделать без UNION.

+1

Всегда полезно опубликовать SQL, который вы попробовали, который не совсем делает то, что вам нужно. –

+1

И база данных (и версия), которую вы используете. –

ответ

4

Вам необходимо поставить свое условие в пункт ONLEFT JOIN.

Select 
    u.first_name, 
    u.last_name, 
    n.status 
From users u 
Left Join networks n On ( (n.user_id = 1 And n.friend_id = u.id) 
          Or (n.friend_id = 1 And n.user_id = u.id) 
Where u.id <> 1 

Это должно вернуть вас всех пользователей (за исключением John Smith) и состояние friend если John Smith либо другом этого пользователя, этот пользователь друг John Smith.

+0

Да, когда вы ставите n.user_id = 1 И n.friend_id = u.id в предложении where вы меняете его из левого соединения во внутреннее соединение. Очень многие люди не знают об этом. – HLGEM

2

Возможно, вам не нужно предложение WHERE, и вместо этого поставьте условие в предложение «ON», которое следует за вашей «LEFT JOIN». Это должно решить ваши проблемы. Кроме того, убедитесь, что основная таблица находится в левой части левого соединения, в противном случае вы должны использовать правильное соединение.

0

В дополнение к (правильным) ответам выше, что такие условия должны идти в предложении ON, если вы действительно хотите поместить их в предложение WHERE по какой-либо причине, просто добавьте условие, что значение может быть нулевым.

WHERE (networks.friendid = 2 OR networks.friendid IS NULL) 
0

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

select id, first_name, last_name, status 
from users u 
left join networks n on u.id = n.user_id 
        and n.friend_id = 1 
where id <> 1;       

Левых присоединиться будет держать строки из users, которые не имеют соответствующие строки в networks и добавлении and n.friend_id = 1 пределов, когда статус «друзья» возвращаются. Наконец, вы можете исключить строку из users, на которую выполняется запрос.