SQL友元函数

标签 sql

构建好友“功能”的最佳方式是什么?
这就是我的想法: 假设我有一个包含以下列的用户表:user_id、用户名、密码... 以及一个包含 friend 姓名的表格,其中包含以下列:friend1、friend2、accepted。

如果 user2 添加了 user1,我希望 user2 显示在 user1 的个人资料上,user1 显示在 user2 的个人资料上...:O

这看起来有点困惑......有更聪明的方法吗?

最佳答案

CREATE TABLE (friend_id_a, friend_id_b, accepted)

定义约束:friend_id_a < friend_id_b .

使用您的实体填充表,如下所示:

INSERT
INTO friend_friend(friend_id_a, friend_id_b)
VALUES (LEAST(@id1, @id2), GREATEST(@id1, @id2))

要选择一个人的所有 friend :

SELECT friend_id_b
FROM friend_friend
WHERE friend_id_a = @id
 AND accepted
UNION ALL
SELECT friend_id_a
FROM friend_friend
WHERE friend_id_b = @id
 AND accepted

此处的 UNION ALL 允许您使用索引并避免为了唯一性而进行额外排序。

以上所有内容对于作为对称和反反射关系的“友谊”都是有效的。这意味着:

  • 如果ab的好友,那么 ba

  • 的好友
  • a 从来都不是a的 friend

关于SQL友元函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/474843/

相关文章:

sql - 可序列化和可重复读取隔离级别有什么区别?

SQL:JOIN与嵌套查询

mysql - 使用嵌套查询和内连接清理 SQL 查询

mysql - 通过另一列对联合选择中的列进行排序

PHP/SQL 将查询结果分组到数组中

mysql - 查找连续索引,直到某些字段发生变化

mysql - 数据截断错误和 int 数据类型

c# - 检查行是否已在 SQL 中更新的最佳方法

sql - Oracle中有没有一种方法可以使列不区分大小写?

PostgreSQL存储过程,如何返回结果集