2

我的网站上有一个简单的朋友系统。现在我正在尝试创建一个多用户群消息系统,但仅限于朋友之间。我的消息系统的“收件人”值是逗号值,我想检查它们是否都是发送消息的人的朋友。

例如,我可以通过以下查询获取用户的所有朋友:

SELECT relation_setter user_id
FROM users_relationships
WHERE relation_getter = {$logged_in_user}
AND active = 1
UNION
SELECT relation_getter user_id
FROM users_relationships
WHERE relation_setter = {$logged_in_user}
AND active = 1

我的消息表单中有natasha, reeta一个 $_POST['to'] 值,然后我将其转换为用户 ID 并得到类似126152, 112238

现在我如何在一个查询中检查这些 id 是否都是登录用户的朋友。我不想在循环中运行我的 is_friend 函数,该函数会检查单个用户 ID 是否是登录用户的朋友。

关系模式:

用户关系

id PK
relation_setter FK user_id
relation_getter FK user_id
active smallint(1)

relation_setter是发送好友请求的人。为了得到我所有的朋友,我得到了我的 ID 为 或 的所有relation_setterID relation_getter

用户

user_id PK
name
username
password
etc etc...
4

1 回答 1

1

您的帖子对架构提供了模糊的见解,因此我将使用一些假设

您可以通过 IN 语句找到与其朋友匹配的所有 id。由于您已经将它们作为带有逗号的数值,您可以这样做:

SELECT user_id
FROM users_relationships
WHERE relation_getter IN (126152,112238,123456)
AND active = 1

这将只返回匹配的朋友的记录。然后,您可以将行数与查询中的元素数进行匹配,以确定他们是否是朋友。您也可以只发送给匹配的人。

编辑

SELECT user_id
FROM users_relationships
WHERE relation_getter IN (126152,112238,123456)
OR relation_setter IN (126152,112238,123456)
AND active = 1

这将返回此人朋友的所有用户 ID,无论他们是 getter 还是 setter,并且它是活动的。

编辑 2

新表

relationships_members

id FK (from users_relationships; not unique)
user_id

关系成员的样本将是

  id  |  user_id  |   relation_setter
--------------------------------------
  1      12345               1  
--------------------------------------
  1      98765               0
--------------------------------------

然后,如果您查询,您只会收到有效的 users_relationships ID

select distinct a.id, b.user_id as friend
from (
    select distinct id as friend
    from relationships_members
    where user_id = {$logged_in_user}
) a, relationships_members b
WHERE a.id = b.id
and user_id IN (126152,112238,123456)
于 2013-04-02T12:40:51.743 回答