检查用户和其他用户是否彼此喜欢并获取喜欢的用户信息

时间:2016-01-27 18:46:19

标签: mysql sql

这是我的第一个问题,虽然我多年来一直在利用这个网站寻求帮助。也许是因为我病了,但我无法解决问题。

我在数据库[User][Like]

中有两个表

[User]表包含基本信息,如(idnameage)...

[Like]表只是存储哪些用户喜欢哪些useruseruser)...例如,如果User A喜欢{{1}它将它作为User B存储在[Like]表中。使用外键约束。

我现在需要从数据库中获取user (A) likes user(B)所有User A也喜欢的用户,包括来自User A表的所有相应数据。

示例...

[User]

假设我正在检查的当前用户是[Like table] user A -> user B user B -> user A user A -> user C user C -> user B ,我需要我的查询返回

User A

因为(user B, user B's name, user B's age) User A彼此相似,所以我只需要信息User B

My Current MySQL声明:

User B

这似乎让那些喜欢SELECT li.like_id from `like` as li join `like` as ui on li.like_id = ui.user_id where li.user_id = **USER_A** group by li.like_id; 的人回归......我无法弄清楚为什么,因为正如我之前提到的,我已经不在了......但我必须要工作......所以工作我会...在帮助下。感谢。

2 个答案:

答案 0 :(得分:1)

SELECT l.like_id
FROM like as l
WHERE l.user_id=USER_A
AND EXISTS
  (SELECT l2.like_id
   FROM like as l2
   WHERE l2.like_id=USER_A
   AND l2.user_id=l.like_id);

答案 1 :(得分:1)

select u.*
from
    `like` ul inner join `like` lu
        on ul.user_id = lu.like_id and ul.like_id = lu.user_id
    inner join `user` u
        on u.id = ul.like_id
where
    ul.user_id = ?

EXPLANATION 它们的键实际上是在like表的两个实例之间的连接中。最终它表示匹配每个"喜欢"与另一个"喜欢"具有相同的user_id和like_id值,但顺序相反。使用内连接而不是外连接可以保证关系是互惠的,因此它会丢弃所有您不感兴趣的关系。

此时你只对#34;喜欢"感兴趣。用户的属性,因此最后一步是针对ul.like_id表查找user。 (lu.user_id必须具有相同的值,因此它也可以起作用。)

notevenwrong的回答几乎完全相同。它确实具有在两个地方使用USER_A参数的缺点,尽管可以通过与外部引用相关联在子查询中消除它。

我认为连接有点突出了查询的对称性,更适合其他用途。 exists版本的速度当然可能更快。