我有两张桌子:
我想从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
我想为所有其他用户搜索John Smith,所以我想得到:
id first_name last_name status
------------------------------------
2 Tom Summers friends
3 Amy Wilson NULL
我尝试执行LEFT JOIN然后执行WHERE语句,但它没有用,因为它排除了与其他用户有关但不包含此用户的行。
我可以使用UNION语句执行此操作,但我想知道是否可以在没有UNION的情况下执行此操作。
答案 0 :(得分:4)
您需要将条件纳入ON
的{{1}}子句。
LEFT 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
返回。
答案 1 :(得分:3)
您可能不需要WHERE子句,而是将条件放入“LEFT JOIN”后面的“ON”子句中。这应该可以解决你的问题。另外,请确保主表位于左连接的左侧,否则,您应该使用右连接。
答案 2 :(得分:0)
除了上面的(正确)回复之外,这些条件应该放在ON
子句中,如果你真的想出于某种原因将它们放在WHERE
子句中,只需添加一个条件:值可以为null。
WHERE (networks.friendid = 2 OR networks.friendid IS NULL)
答案 3 :(得分: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
中排除正在运行查询的行。