我需要计算用户之间的共同好友,目前它工作正常,但我不认为它将工作的用户谁有一个大的追随者基础,它将需要很长的时间加载和比较.请建议我良好的数据库设计/查询(如果需要). 我创建了表,并有一个如下查询:

表:

export enum FollowStatus {
  REQUESTED = "REQUESTED",
  APPROVED = "APPROVED",
  DECLINED = "DECLINED"
}

@Entity("followers")
export class Followers {
  @PrimaryGeneratedColumn()
  @Property()
  id: number;

  @Property()
  @Column()
  followerId: string;

  @ManyToOne(() => Users, { eager: true })
  @JoinColumn({ name: "followerId" })
  follower: Users;

  @Property()
  @Column()
  followedId: string;

  @ManyToOne(() => Users, { eager: true })
  @JoinColumn({ name: "followedId" })
  followed: Users;

  @Column({
    type: "enum",
    enum: FollowStatus,
    default: FollowStatus.REQUESTED
  })
  @Property()
  status: FollowStatus;
}

帖子主题:回复:

  async getFollowers(userId: string, page: number, limit: number) {
    const builder: SelectQueryBuilder<Followers> = this.createQueryBuilder("followers")
      .where("followers.followedId = :userId", { userId })
      .andWhere("followers.status = :status", { status: "APPROVED" })
      .leftJoinAndSelect("followers.follower", "follower")
      .leftJoinAndSelect("follower.followers", "followerFollowers")
      .take(limit)
      .skip((page - 1) * limit);

    const followers = await builder.getManyAndCount();
    return followers;
  }

主要功能:

async getFollowers(userId: string, page: number, limit: number) {
    page = page || DEFAULT_PAGE_NUMBER;
    limit = limit || DEFAULT_PAGE_SIZE;

    const followers = await this.followersRepository.getFollowers(userId, page, limit);
    const myFollowers = followers[0].map((follower) => follower.followerId);

    const response: SearchResponse<FollowerUsersInterface> = {
      data: await Promise.all(
        followers[0].map(async (user) => {
          const isFollowing = user.follower.followers.findIndex((follower) => follower.followerId == userId);

          const userFollowers = user.follower.followers;

          // count mutual followers, exluding the user itself
          const mutualFollowersCount = userFollowers.filter((follower) => {
            if (follower.followerId !== user.followerId) {
              return myFollowers.some((myFollower) => myFollower === follower.followerId && follower.status === FollowStatus.APPROVED);
            }
          }).length;

          return {
            isFollowing: isFollowing > -1,
            userId: user.follower.id,
            userName: user.follower.userName,
            profilePic: await this.s3.getSignedUrl(user.follower.profilePic),
            mutualFollowers: mutualFollowersCount
          } as FollowerUsersInterface;
        })
      ),
      totalCount: followers[1]
    };

    return response;
  }

数据库记录示例:

# id    status     followerId     followedId
20    APPROVED    3              PBpq
22    APPROVED    1              PBpq
24    APPROVED    2              PBpq
25    APPROVED    PBpq           2
26    APPROVED    1              2
28    APPROVED    INOr           PBpq
29    APPROVED    2NAo           PBpq
34    APPROVED    1              2NAo
  • 预期输出:
  • 假设你的userId是PBpq
  • 如果我访问userId 2,我会看到我共同关注者计数为1
  • 解释:meuserId 1都在userId 2之后,所以我会得到mutual count 1

推荐答案

改变了方法,现在im正在获取用户的追随者列表


  async getFollowers(userId: string, page: number, limit: number) {
    const builder: SelectQueryBuilder<Followers> = this.createQueryBuilder("followers")
      .where("followers.followedId = :userId", { userId })
      .andWhere("followers.status = :status", { status: "APPROVED" })
      .leftJoinAndSelect("followers.follower", "follower")
      .take(limit)
      .skip((page - 1) * limit);

    const followers = await builder.getManyAndCount();
    return followers;
  },

然后,通过它,一个再见一个,得到共同的追随者列表.

 async getMutualFollowersCount(myuserId: string, userId: string): Promise<number> {
    const subQuery: SelectQueryBuilder<Followers> = this.createQueryBuilder("subFollowers")
      .where("subFollowers.followedId = :myuserId", { myuserId })
      .andWhere("subFollowers.status = :status", { status: "APPROVED" })
      .select("subFollowers.followerId");

    const builder: SelectQueryBuilder<Followers> = this.createQueryBuilder("followers")
      .where("followers.followerId = :userId", { userId })
      .andWhere("followers.status = :status", { status: "APPROVED" })
      .andWhere(`followers.followedId IN (${subQuery.getQuery()})`)
      .setParameters(subQuery.getParameters());

    const mutualFollowersCount = await builder.getCount();
    return mutualFollowersCount;
  },

Mysql相关问答推荐

递归查询意外地为一个字段返回空值

使用Workbench时如何添加mysqldump配置标志

我可以在姓名和姓名日期之间进行搜索吗?

如何确保 SQL 记录的列不引用它自己的主键?

为什么Mysql会根据查询参数改变查询执行计划?

如何编写按天数汇总值的sql查询?

MySQL 使用了错误的索引

mySQL 中的主数据库和 IF 错误?

我将如何构建一个 SQL 查询来从交易表中 Select 第一次存款、第二次存款和额外存款

添加一个日期字段大于另一个日期字段的要求

如何将表的链接列转换为 SQL 中的行?

MySql,将日期和时间列组合成时间戳

MySQL:按字段排序,将空单元格放在末尾

如何用一系列日期填充表格?

MySQL 整数与日期时间索引

PHP MySQLI 防止 SQL 注入

MySQL中的行值增加和减少1

Mysql中int(10)的最大大小是多少

将 Blob 转换为字节数组的最简单方法

从 MySQL JSON 数据类型中提取不带引号的值