好友列表的 SQL 加入帮助

Posted

技术标签:

【中文标题】好友列表的 SQL 加入帮助【英文标题】:SQL join help for friend list 【发布时间】:2010-02-04 21:52:48 【问题描述】:

我有三个数据库表:usersuser_profilesfriends

用户

身份证 用户名 密码

user_profiles

身份证 user_id 全名

朋友

身份证 usera_id userb_id

查找任何用户的朋友列表并加入表usersuser_profiles 以获取该朋友的个人资料和用户信息的查询是什么?

【问题讨论】:

你不需要朋友表中的 'id' 列 - 你只需要对 'usera_id' 和 'userb_id' 组合的唯一约束。 usera_iduserb_id 设为主键(复合/复合)将是理想的选择。 也不清楚 user_profiles 中的 'id' 列将用于什么。如果允许一个人(由 users 表中的 id 号标识)拥有多个 user_profile 条目,并且如果有办法确定在任何给定时间要使用这几个 user_profile 条目中的哪一个,那么可能是 user_profiles .id 列将具有一定的相关性。 一个检查约束,其中 usera_id @Jonathan Leffler、@OMG Ponies、@KM -- 你假设“朋友链接”是互惠的。仅仅因为 Bob 是 Joe 的朋友,并不一定意味着 Joe 是 Bob 的朋友。这取决于应用程序的设计行为。也许 Joe 取消了 Bob 的好友关系,但是应用程序的要求是不让 Bob 知道他已经取消了好友关系,所以 Bob->Joe 好友关联仍然存在,但没有 Joe->Bob 的情况。 【参考方案1】:

用途:

SELECT f.username,
       up.*
  FROM USERS f
  JOIN USER_PROFILES up ON up.user_id = f.id
  JOIN FRIENDS fr ON fr.userb_id = f.id
  JOIN USERS u ON u.id = fr.usera_id
 WHERE u.username = ?

...假设userb_id 是朋友ID。

【讨论】:

好友 ID 可以是 usera_id 或 userb_id 的任意字段。当两者都是朋友时,数据将插入到朋友表中。所以朋友ID可以在a或b中 @askkirati:我明白,但如果你想要给定USERS 记录的朋友列表,你必须选择两个方向之一。 小马:我如何决定方向。因为如果 userb 首先添加用户 a,则 userb 的 id 将转到 usera_id 字段,而 usera 在 userb_id 字段中。我如何找到方向。或者我应该在朋友表中创建两个条目 这工作正常,谢谢我需要为朋友列表输入两个条目【参考方案2】:

这可能不是最好的方法,但这感觉是合乎逻辑的方式:

select a.id , a.friend_id ,
Users.username
from
 ( SELECT id , IF(usera_id = 1, userb_id , usera_id) friend_id
 FROM friends
 where usera_id = 1 OR userb_id = 1 ) a
left join Users on a.friend_id = Users.id

这使用了一个 mysql 函数,所以可能无法在 Oracle/MSSQL 中工作

【讨论】:

【参考方案3】:

改掉坏习惯(不在 FROM 子句中使用 JOIN 表示法):

SELECT a.id, a.username, a.full_name,
       b.id, b.username, b.full_name
  FROM friends AS f, users AS ua, users AS ub,
       user_profiles AS a, user_profiles AS b
 WHERE f.usera_id = ua.id
   AND f.userb_id = ub.id
   AND a.user_id  = ua.id
   AND b.user_id  = ub.id

关键是使用表别名(所有那些“AS”子句)并在必要时多次引用同一个表。

有人可以用 JOIN 代替。

【讨论】:

【参考方案4】:

对eugene y's answer 进行一些修改,可以吗?

SELECT * FROM users u
JOIN friends f ON (f.userb_id = u.id OR f.usera_id = u.id)
JOIN user_profiles p ON u.id = p.user_id
WHERE u.id = ?

【讨论】:

现在似乎可以工作了我可以只选择联接表 user_profiles 的特定字段

以上是关于好友列表的 SQL 加入帮助的主要内容,如果未能解决你的问题,请参考以下文章

ios qqq好友列表滑动怎么实现

没有密码,怎样查看到别人的QQ好友列表?

如何获得QQ好友列表

在Android上做一个好友列表,有分组,有好友,分组和好友都动态实现可增可删

java在线聊天项目 swt可视化窗口Design 重新设计好友列表窗口 增加菜单栏

qq好友列表用java怎么做