【问题标题】:SQL join help for friend list好友列表的 SQL 加入帮助
【发布时间】: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 的情况。

标签: sql mysql


【解决方案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 的特定字段
      猜你喜欢
      • 1970-01-01
      • 2011-03-05
      • 2010-12-31
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多