在这种情况下如何查询两个表?

时间:2015-07-21 01:52:07

标签: php mysql pdo

对于那个拒绝投票的人,你能告诉我原因吗?如果这对你来说似乎微不足道,我将非常感谢你指点我的参考;如果这是一个重复的问题,我将非常感谢您指出我之前的问题。谢谢!

我有两个表,userfriend。目标如下:用户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)不是朋友。所以基本上有以下两种情况:

  1. 用户2(ghi)想要查看用户3(def)的信息,查询只返回ghi的用户名但不是地址
  2. 用户1(ghi)希望查看用户3(abc)的信息,查询返回ghi的用户名和地址
  3. 是否可以使用一个查询来完成?

2 个答案:

答案 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将从他的朋友的空为空加入,因此只返回一个简单的“不是朋友”。