查找使用关系表的所有朋友

时间:2013-02-07 06:35:21

标签: php mysql sql

使用所有工具和CMS,我一直很容易创建应用程序。虽然我第一次使用高级SQL而没有任何ORM,所以我不知道如何获得我正在寻找的结果。

我正在努力建立一个用户友好系统。基本上用户可以添加另一个用户作为朋友,该朋友可以接受。我有两张桌子用户& Users_Relationships。 Users表有明显的用户信息,User_Relationships表有relation_setter(请求者用户的id),relation_getter(请求用户的id)和active

问题是我需要在页面上显示所有朋友(活动或非活动)。我知道以下查询是错误的,但这是我提出的:

$sql = "SELECT *
        FROM users_relationships
        LEFT JOIN users
        ON users_relationships.relation_setter = users.user_id
        WHERE users_relationships.relation_getter = " . $logged_in_id.
      " OR users_relationships.relation_setter = " . $logged_in_id;

我需要的是关系表中的所有用户作为带有$ logged_in_user的setter或getter。简单地说,我需要所有与我朋友在一起的人,无论是谁添加了他们,我或他们,并根据我每行获得的“活跃”价值,它将打印“请求待处理”或不。

上面的查询给我带来了非常复杂的结果,许多重复项请求待处理也是错误的。

2 个答案:

答案 0 :(得分:2)

JOIN表格Users再一次这样:

SELECT 
  us.UserName AS SetterName,
  ug.UserName AS GetteerName,
  ur.Active AS Status,
  ...
FROM users_relationships ur
LEFT JOIN users us ON ur.relation_setter = us.user_id
LEFT JOIN users ug ON ur.relation_getter = ug.user_id 
WHERE $logged_in_id IN(ur.relation_getter, ur.relation_setter);

SQL Fiddle Demo


更新1

为了将朋友列表作为一个列表而不是两个用户的名称,您可以这样做:

SELECT 
  us.UserName AS FriendName,
  ur.Active AS Status
FROM 
(
  SELECT relation_setter user_id, active 
  FROM users_relationships
  WHERE relation_getter = $logged_in_id 
  UNION  
  SELECT relation_getter, active 
  FROM users_relationships
  WHERE relation_setter = $logged_in_id 
) AS ur
LEFT JOIN users us ON ur.user_id = us.user_id;

SQL Fiddle Demo

这将为您提供登录用户的朋友姓名列表。


更新2

此查询的工作原理?

登录使用的列表是relation_setterrelation_getter。因此,为了将这两个列放在一列中,我使用两个查询得到每个查询,一个用于relation_setter

  SELECT relation_setter user_id, active 
  FROM users_relationships
  WHERE relation_getter = $logged_in_id 

另一个用于relation_getter

  SELECT relation_getter, active 
  FROM users_relationships
  WHERE relation_setter = $logged_in_id 

然后我使用 UNION 将它们作为一个结果集:

  SELECT relation_setter user_id, active 
  FROM users_relationships
  WHERE relation_getter = $logged_in_id 
  UNION  
  SELECT relation_getter, active 
  FROM users_relationships
  WHERE relation_setter = $logged_in_id 

此查询会将两个查询中的所有数据仅提供给两个字段user_idactive

请注意:

  • UNION隐式选择不同的行,它会消除重复的行,但UNION ALL会保留这些重复的行。

  • 两个联合的结果集将具有在第一个选择中指定的列的名称;在我们的查询中,第二个选择的第一列的名称为relation_getter,来自此列的值将位于userid之下,因为它是在第一个查询中定义的。

然后我在子查询中包含了这两个联合查询,并将其与Users表连接起来,我们完成了:)

答案 1 :(得分:0)

$sql = "SELECT *
        FROM users_relationships rel
        LEFT outer JOIN users from  ON rel.relation_setter = from.user_id
        LEFT outer JOIN users to ON rel.relation_getter = to.user_id
        WHERE rel.relation_getter in (" . $logged_in_id. "," . $logged_in_id . ")";