mysql - "friends of friends"类似sql查询

标签 mysql sql

我正在构建一个用户可以相互联系的应用程序(类似于任何社交网络中的 friend )。

我将该连接保存在具有以下结构的表中:

id_user1 | id_user2 | is_accepted | is_blocked | created_at

用户之间的连接是双向的,所以当两个用户连接时,表中只有一条记录。 user_id 是否在 id_user1id_user2 列中并不重要。

现在我需要编写一个 sql 查询来获取某个用户的“ friend 的 friend ”,这些用户还不是该用户的 friend 。 此外,用户必须被接受而不是被阻止。

在简历中,这是我需要执行的步骤。

  1. 找到与我想要的用户关联的所有用户 ID(id_user1 = current_userid_user2 = current_user and is_accepted and !blocked)

  2. foreach of the returned user_ids --> 获取所有关联的用户(忽略与当前用户的关联)(确保它是accepted!blocked ).

我怎样才能做这样的查询?

感谢您的帮助。

最佳答案

由于其他人提到的原因,并且因为我看到它在其他系统中运行得更好,所以我会为每个方向设置一行。

primary_user_id | related_user_id | is_accepted | is_blocked | created_at

然后您还可以在 user_id 上创建一个聚簇索引,这应该足以抵消将行数加倍的开销。

您的第一个查询将转化为如下内容:

SELECT f1.related_user_id
FROM friends f1
WHERE f1.primary_user_id = @current_user
AND f1.is_accepted = 1 AND f1.is_blocked = 0
AND EXISTS (
  SELECT *
  FROM friends f2
  WHERE f1.related_user_id = f2.primary_user_id
  AND f2.related_user_id = @current_user
  AND f2.is_accepted = 1 AND f2.is_blocked = 0

不确定您是否可以在 MySql 中执行表函数。如果是这样,则将其包装到一个函数中,以使您的第二个查询更简单。

关于mysql - "friends of friends"类似sql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5793159/

相关文章:

sql - LOAD DATA LOCAL INFILE 读取问题

mysql - FROM_UNIXTIME() 不工作 mysql

php - MySQL通过PHP更新多行

c# - 当 CRM 中的记录发生更改时更新源中的记录

php - 如何在 .jpg 链接中显示来自 blob 的 .jpg 图像

php - 检查数组的键值是否为 null 或空字符串

php - MYSQL查询根据名字和姓氏查找重复记录

sql - 如何在 Azure Synapse 无服务器 SQL 池中使用 CETAS 创建外部表时添加自动递增列?

MySQL:可以递归锁定表吗?

mysql - 如何删除MySQL中除最新数据之外的重复数据