对于那个拒绝投票的人,你能告诉我原因吗?如果这对你来说似乎微不足道,我将非常感谢你指点我的参考;如果这是一个重复的问题,我将非常感谢您指出我之前的问题。谢谢!
我有两个表,user
和friend
。目标如下:用户a
想要获取另一个用户b
的信息;返回的信息取决于他们是否是朋友。具体而言,如果他们是朋友,a
可以看到b
的{{1}}和username
;如果没有,address
只能看到a
的用户名。
b
表看起来像:
user
id username address
1 abc XXXX Rd. XXXX
2 def XXXX Rd. XXXX
3 ghi XXXX Rd. XXXX
表看起来像:
friend
2(id id1 id2
1 1 2 // so 1 (abc) and 2 (def) are friends
2 1 3 // so 1 (abc) and 3 (ghi) are friends
)和3(def
)不是朋友。所以基本上有以下两种情况:
ghi
)想要查看用户3(def
)的信息,查询只返回ghi
的用户名但不是地址ghi
)希望查看用户3(abc
)的信息,查询返回ghi
的用户名和地址是否可以使用一个查询来完成?
答案 0 :(得分:2)
您可以使用JOIN并检查已加入的用户列是否存在(不为空)以确定是否存在友谊。
E.g。如果用户def
(2)想要用户ghi
(3)的信息:
SELECT
user.username,
user.address,
friend.id AS are_friends
FROM user
INNER JOIN friend
ON (friend.id1 = user.id AND friend.id2 = 2)
WHERE user.id = 3;
如果用户2和3之间的链接存在,这应该只从PDO处理程序返回一行。如果它没有,则内连接将不起作用 - 如果您在此处使用左连接,则会为are_friends
字段返回null。
当然,您可以使用当前登录用户的ID替换该查询中的2
,并将3
替换为您想要信息的用户ID。
答案 1 :(得分:2)
您可以进行简单的连接,但是对于ADDRESS的问题,请将其放在IF()构造中。只抓住一个朋友。
select
u.username as NameOfPossibleFriend,
coalesce( u.Address, "not a friend" ) as FriendAddress
from
user u
LEFT JOIN friend f
on ( f.id1 = UserIDYourAreBasing
and f.id2 = IDOfPossibleFriend )
OR ( f.id2 = UserIDYourAreBasing
and f.id1 = IDOfPossibleFriend )
where
u.id = IDOfPossibleFriend
所以,我开始使用用户帐户明确查找您正在寻找的人的ID作为可能的朋友。至少,你知道可能的朋友的ID并想要这个名字,但是要以暴露地址为条件。
所以,现在是LEFT-JOIN。因为我不知道ID1与ID2的表结构的标准,因为它总是为低/高或高/低ID,以查看是否可供朋友使用。那是。如果用户1和用户3是朋友,是否有可能记录总是被添加到他的表中,因为ID1 = 1和ID2 = 3,或者可能有ID1 = 3和ID2 = 1(替代顺序,但结果相同。 ..用户1和3是朋友)。
所以,左连接说看看
ID1 is the original person and ID2 = the friend you are hoping to match.
OR
ID1 is the friend you are hoping to match and ID2 is the original person
因此,左连接将找到一个记录匹配,然后ID将不为空并且将拉出朋友的地址...如果没有这样的朋友的匹配,该ID将从他的朋友的空为空加入,因此只返回一个简单的“不是朋友”。