好友列表的SQL加入帮助

好友列表的SQL加入帮助,sql,mysql,Sql,Mysql,我有三个数据库表:users、user\u profiles和friends: 用户 身份证 用户名 密码 用户配置文件 身份证 用户id 全名 朋友 身份证 用户识别码 用户b_id 什么样的查询可以查找任何用户的好友列表,并将表users和user\u profiles连接起来,以获取该好友的个人资料和用户信息?养成坏习惯(在FROM子句中不使用JOIN符号): 关键是使用表别名(所有那些“AS”子句)并在必要时多次引用同一个表 有人可以用JOIN来写这篇文章。使用: SELEC

我有三个数据库表:
users
user\u profiles
friends

用户

  • 身份证
  • 用户名
  • 密码
用户配置文件

  • 身份证
  • 用户id
  • 全名
朋友

  • 身份证
  • 用户识别码
  • 用户b_id

什么样的查询可以查找任何用户的好友列表,并将表
users
user\u profiles
连接起来,以获取该好友的个人资料和用户信息?

养成坏习惯(在FROM子句中不使用JOIN符号):

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

有人可以用JOIN来写这篇文章。

使用:

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\u id
是朋友id。

对其进行一些修改,这会起作用吗

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 = ?

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

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中可能不起作用

您不需要friends表中的“id”列-您只需要对“usera_id”和“userb_id”的组合设置一个唯一的约束。将
usera_id
userb_id
设为主键(复合键)很理想。还不清楚用户配置文件中的“id”列将用于什么用途。如果允许一个人(由用户表中的id号标识)拥有多个用户配置文件条目,并且如果有办法确定在任何给定时间使用这些用户配置文件条目中的哪一个,那么也许user_profiles.id列会有一些相关性。usera_idJoe friend关联仍然存在,但Joe->Bob情况不存在。friends ID可以在任何字段usera\u ID或userb\u ID中。当两者都是朋友时,数据将插入friends表中。因此,朋友id可以是a或Bb@askkirati:我理解,但是如果你想要一个给定
用户的朋友列表,你必须从两个方向中选择一个。小马:我如何决定方向。因为如果userb首先添加用户a,那么userb的id将转到usera_id字段,usera在userb_id字段中。我该如何找到方向呢?或者我应该在friends表中创建两个条目吗?这可以正常工作,感谢我需要为friend List创建两个条目。现在似乎可以工作了。我可以只选择联接表用户配置文件的特定字段吗
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