1

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

我正在尝试制作一个用户朋友系统。基本上一个用户可以添加另一个用户为好友,好友用户可以接受。我有两个表用户和用户关系。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。简单地说,我需要所有与我成为朋友的人,无论是谁添加了他们,我或他们,并且基于我为每一行获得的“活动”值,它会打印“请求待处理”或不打印。

上面的查询给我带来了非常复杂的结果,其中许多重复的请求挂起也是错误的。

4

2 回答 2

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 小提琴演示


更新 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 小提琴演示

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


更新 2

这个查询是如何工作的?

登录使用的列表是 arelation_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表连接起来,我们就完成了:)

于 2013-02-07T06:39:18.477 回答
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 . ")";
于 2013-02-07T06:46:06.320 回答