首页 > 解决方案 > SQL通过多对多关系中的数据选择最大的10个条目

问题描述

我有一个 SQL 数据库,其中包含一个 User 对象、一个 Guild 对象和一个 GuildMember 对象。用户可以在许多公会中,并且公会可以有许多用户,因此 GuildMember 对象将它们链接起来。User 对象包含他们当前资金余额的值,我正在寻找一种方法来获得特定行会中最富有的用户。现在我只是从公会中获取所有用户并自己对其进行排序,但公会中可能有多达 10 万用户,这似乎非常低效。有没有办法让 SQL 做更多的工作?基本上,我只是想找出一个语句来从公会 ID 返回前 10 名左右最富有的用户。我正在运行一个 MySQL 数据库。

模型:

用户 --> GuildMember <-- 公会

id: 字符串 | UID:字符串 | 标识:字符串

经济:整数 | GID:字符串 | 其他数据

我一直在使用 Sequelize(尽管我非常愿意使用准备好的 SQL 语句),这是我当前在 TypeScript 中的系统:

public static async getTop(guildId: string, num: number) {
  return Db.Guild.findByPk(guildId, { include: [{ model: Db.User, attributes: ['id', 'econ'] }] })
  .then(guild => (<UserInstance[]>guild.Users).sort((a, b) => b.econ - a.econ).slice(0, num));
}

样本数据:

用户:id:1,经济:10

用户:id:2,经济:3

...

用户:ID:7,经济 12

--

公会:id:1,其他数据

公会:id:2,其他数据

--

GuildMember: UserId: 1, GuildId: 2

GuildMember:用户 ID 7,GuildId:2

--

查询公会 2 中最富有的人的预期输出:[用户 7,用户 1]。

显然这是一个非常简单的例子,因为用户可能属于多个公会,每个公会会有数千个用户。我需要返回前 10 名。

标签: mysqlsqlsequelize.jsrelationship

解决方案


推荐阅读