2015-07-21 74 views
0

对于拒绝投票的人,请您向我解释原因?如果这对你来说似乎微不足道,我将不胜感激地向你指出一个参考;如果这是一个重复的问题,我希望你能指出我以前的问题。谢谢!如何在这种情况下查询两个表?

我有两个表,userfriend。目标如下:用户a想要获得另一个用户的信息b;返回的信息取决于他们是否是朋友。具体来说,如果他们是朋友,a可以看到busernameaddress;如果没有,a只能看到b的用户名。

user表如下所示:

id username address 
1 abc  XXXX Rd. XXXX 
2 def  XXXX Rd. XXXX 
3 ghi  XXXX Rd. XXXX 

friend表如下所示:

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 

2(def)和3(ghi)不是朋友。所以基本上有以下两种情况:

  1. 用户2(def)希望看到用户3(ghi)的信息,查询返回ghi的用户名只,但没有解决
  2. 用户1(abc )想要查看用户3(ghi)的信息,查询返回ghi的用户名和地址

是否可以使用一个查询来完成?

+0

您是否可以为* not-allowed *数据元素(即address)返回NULL或空字符串? –

+0

@ PM77-1,是的,这是我的目的的正确方法。 – Dainy

回答

2

您可以使用JOIN并检查联合用户列是否存在(非空)以确定友谊是否存在。

E.g.如果用户def(2)希望(3)用户ghi信息:

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; 

这应该只从你的PDO处理程序返回一行,如果用户2和3之间的链接存在。如果不是,则内部连接将不起作用 - 如果您在此处使用了左连接,它将会,但会为are_friends字段返回空值。

当然,您可以用该当前登录用户的ID替换该查询中的2,并将3替换为需要信息的用户的ID。

+0

这是做的工作。谢谢。 – Dainy

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,并希望名称,但有条件公开地址。

所以,现在是左加盟。由于我不知道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将从他的朋友的加入中为空,因此仅返回一个简单的“不是朋友”。

+0

谢谢你的回答。 scrowler的回答为我做了工作,所以我接受了他的工作。仍然感激你的时间! – Dainy