MySQL 关注/粉丝 表结构设计及查询(附带SQL)

表设计

image-1663304159322

  1. user_id 设置索引 用于查询 我的关注
  2. focus_user_id 设置索引 用于查询 我的粉丝
  3. user_id ,focus_user_id 设置联合唯一索引 数据库约束控制 不会出现重复关注
  4. create_time 设置索引 用于查询 我的粉丝/我的关注 列表时 按时间倒叙分页查询

查询

1.查询 A 的关注用户列表:

select focus_user_id from user_focus where user_id = A.userId order by create_time desc

2.查询 A 的粉丝列表:

select user_id from user_focus where focus_user_id = A.userId order by create_time desc

3.查询 A,B二个用户之间的关注状态:

( SELECT 1 from user_focus where user_id = A.userId and focus_user_id = B.userId )
union all
( SELECT 2 from user_focus where user_id = B.userId and focus_user_id = A.userId )

这里会返回一个List 数组,有四种情况:

  1. 空数组 A,B 之前无任何关系
  2. [1,2] A,B 相互关注
  3. [1] A 关注了 B
  4. [2] B 关注了 A

4.查询我关注的用户他们关注了哪些用户,并排除我关注的用户和自己

<select id="getXXX" resultType="java.lang.String">
       select distinct B.focus_user_id from user_fans A
       INNER JOIN user_fans B on A.focus_user_id = B.user_id
       LEFT JOIN user_fans C on B.focus_user_id = C.focus_user_id AND C.user_id = #{userId,jdbcType=VARCHAR}
       where A.user_id = #{userId,jdbcType=VARCHAR} AND B.focus_user_id != #{userId,jdbcType=VARCHAR}
       AND C.focus_user_id is NULL limit 10
  </select>

查询用户A的粉丝,并且这些粉丝是我关注的人

<select id="getXXX" resultType="java.lang.String">
      SELECT
        A.focus_user_id
      from user_fans A
      INNER JOIN user_fans B on A.focus_user_id = B.user_id
      where A.user_id = #{myUserId,jdbcType=VARCHAR}
      AND B.focus_user_id = #{userId,jdbcType=VARCHAR} limit 3
  </select>