SQL检查是否存在用户关系

时间:2011-01-25 16:18:49

标签: sql mysql postgresql

我设置的用户关系表看起来像这样。

user_relationship

  • relationship_id
  • requesting_user_id
  • requested_user_id
  • relationship_type
  • relationship_status

现在说我要检查一个关系,看看它是否存在于两个用户之间,他们可以说这个例子是ID 1&我可以做一个:

SELECT * 
  FROM user_relationship 
 WHERE (requesting_user_id='1' AND  requested_user_id='2') 
    || (requesting_user_id='2' AND  requested_user_id='1')

但我想知道他们是否有更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:3)

OR是众所周知的糟糕表现者。你可以试试UNION:

SELECT a.* 
  FROM USER_RELATIONSHIP a
 WHERE a.requesting_user_id = '1' 
   AND a.requested_user_id = '2'
UNION
SELECT b.* 
  FROM USER_RELATIONSHIP b
 WHERE b.requesting_user_id = '2' 
   AND b.requested_user_id = '1'

UNION将删除重复项; UNION ALL不会(并且速度更快)。

如果有任何列回来而你没有使用 - 它们不应该在查询中。

索引应该是:

  • requesting_user_id
  • requested_user_id

...要么是单独的,要么是单一的复合索引,但你必须测试才能知道哪种方法效果最好。

答案 1 :(得分:0)

如果您认为用户无法向自己发送请求,则这应该是等效的:

SELECT *
FROM user_relationship
WHERE requesting_user_id IN(1, 2) AND requested_user_id IN(1, 2);

我怀疑这实际上会更快,但至少更容易阅读(在我看来)。

确保您拥有一个涵盖requests_user_id和requested_user_id的索引 - 如果您经常执行此查询,那么这样的索引绝对是必需的。