每个关键字的前 'n' 个结果

2023-12-08

我有一个查询,要获取对特定关键字发表评论的前“n”个用户,

SELECT `user` , COUNT( * ) AS magnitude
FROM `results`
WHERE `keyword` = "economy"
GROUP BY `user`
ORDER BY magnitude DESC
LIMIT 5 

我有大约 6000 个关键字,并且希望运行此查询来获取我们拥有数据的每个关键字的前“n”个用户。感谢您的帮助。


由于您还没有给出架构results,我假设它是这个或非常相似(可能是额外的列):

create table results (
  id int primary key,
  user int,
    foreign key (user) references <some_other_table>(id),
  keyword varchar(<30>)
);

Step 1:聚合依据keyword/user如您的示例查询所示,但对于所有关键字:

create view user_keyword as (
  select
    keyword,
    user,
    count(*) as magnitude
  from results
  group by keyword, user
);

Step 2:对每个关键字组中的每个用户进行排名(请注意使用子查询对行进行排名):

create view keyword_user_ranked as (
  select 
    keyword,
    user,
    magnitude,
    (select count(*) 
     from user_keyword 
     where l.keyword = keyword and magnitude >= l.magnitude
    ) as rank
  from
    user_keyword l
);

Step 3:仅选择排名小于某个数字的行:

select * 
from keyword_user_ranked 
where rank <= 3;

Example:

使用的基础数据:

mysql> select * from results;
+----+------+---------+
| id | user | keyword |
+----+------+---------+
|  1 |    1 | mysql   |
|  2 |    1 | mysql   |
|  3 |    2 | mysql   |
|  4 |    1 | query   |
|  5 |    2 | query   |
|  6 |    2 | query   |
|  7 |    2 | query   |
|  8 |    1 | table   |
|  9 |    2 | table   |
| 10 |    1 | table   |
| 11 |    3 | table   |
| 12 |    3 | mysql   |
| 13 |    3 | query   |
| 14 |    2 | mysql   |
| 15 |    1 | mysql   |
| 16 |    1 | mysql   |
| 17 |    3 | query   |
| 18 |    4 | mysql   |
| 19 |    4 | mysql   |
| 20 |    5 | mysql   |
+----+------+---------+

按关键字和用户分组:

mysql> select * from user_keyword order by keyword, magnitude desc;
+---------+------+-----------+
| keyword | user | magnitude |
+---------+------+-----------+
| mysql   |    1 |         4 |
| mysql   |    2 |         2 |
| mysql   |    4 |         2 |
| mysql   |    3 |         1 |
| mysql   |    5 |         1 |
| query   |    2 |         3 |
| query   |    3 |         2 |
| query   |    1 |         1 |
| table   |    1 |         2 |
| table   |    2 |         1 |
| table   |    3 |         1 |
+---------+------+-----------+

用户在关键词内排名:

mysql> select * from keyword_user_ranked order by keyword, rank asc;
+---------+------+-----------+------+
| keyword | user | magnitude | rank |
+---------+------+-----------+------+
| mysql   |    1 |         4 |    1 |
| mysql   |    2 |         2 |    3 |
| mysql   |    4 |         2 |    3 |
| mysql   |    3 |         1 |    5 |
| mysql   |    5 |         1 |    5 |
| query   |    2 |         3 |    1 |
| query   |    3 |         2 |    2 |
| query   |    1 |         1 |    3 |
| table   |    1 |         2 |    1 |
| table   |    3 |         1 |    3 |
| table   |    2 |         1 |    3 |
+---------+------+-----------+------+

仅每个关键字的前 2 个:

mysql> select * from keyword_user_ranked where rank <= 2 order by keyword, rank asc;
+---------+------+-----------+------+
| keyword | user | magnitude | rank |
+---------+------+-----------+------+
| mysql   |    1 |         4 |    1 |
| query   |    2 |         3 |    1 |
| query   |    3 |         2 |    2 |
| table   |    1 |         2 |    1 |
+---------+------+-----------+------+

请注意,当存在平局时(参见示例中的关键字“mysql”,请参阅用户 2 和 4)——平局中的所有各方都获得“最后”排名,即,如果第二个和第三个平局,则两者都被分配排名 3。


性能:向关键字和用户列添加索引会有所帮助。我有一个以类似方式查询的表,其中两列有 4000 和 1300 个不同值(在 600000 行表中)。您可以像这样添加索引:

alter table results add index keyword_user (keyword, user);

就我而言,查询时间从大约 6 秒下降到大约 2 秒。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每个关键字的前 'n' 个结果 的相关文章

  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 在 MySQL 中存储表情符号的编码问题:如何使用 Prisma ORM 在 NodeJS 中定义字符排序规则?

    亲爱的 Nodejs 专家和数据库专家 我们在 MySQL 数据库中存储表情符号和其他特殊字符时遇到问题 我们使用 Prisma 得到一个错误 这是我们使用的 ORM 参数无法从排序规则 utf8 general ci 转换为 utf8mb
  • 如何修改现有表以添加时区

    我有一个包含 500 多个表的大型应用程序 我必须将应用程序转换为时区感知 当前应用程序使用new java util Date GETDATE 与服务器的时区 即没有任何时区支持 我已将这项任务分为几个步骤 以便于开发 我确定的第一个步骤
  • 如果没有找到值,如何让 MySQL 中的 SUM 函数返回“0”?

    假设我在 MySQL 中有一个简单的函数 SELECT SUM Column 1 FROM Table WHERE Column 2 Test 如果没有条目Column 2 包含文本 Test 然后该函数返回NULL 而我希望它返回 0 我
  • 如何优化这个MySQL慢(非常慢)查询?

    我有一个 2 GB 的 mysql 表 包含 500k 行 我在没有负载的系统上运行以下查询 select from mytable where name in n1 n2 n3 n4 bunch more order by salary
  • 如何在 MySQL 中求和时间?

    正如您在图片中看到的 我有一份停机报告 显示了所选工厂在选定日期的停机时间 现在我想添加所有的值 Time Duration 列并将其显示在附近的单独显示中 TOTAL TIME DURATION 例如 在图像中 所选日期为 2015 年
  • 合并两个 MYSQL SELECT 查询[重复]

    这个问题在这里已经有答案了 可能的重复 如何将两个 Post Category 表 MYSQL SELECT 查询合并为一个 https stackoverflow com questions 12972130 how to combine
  • PHP PDO 使用 bindParam 第一个参数(不带冒号)[重复]

    这个问题在这里已经有答案了 请检查这个 user id int GET user id sql DELETE FROM users WHERE user id user id query db gt prepare sql query gt
  • 每月获取记录,但如果该月没有记录,则为零

    如果我有以下 SQL 表 Tests id type receiveDate 1 Blood 2012 01 18 2 Blood 2012 01 20 3 Blood 2012 01 18 4 Blood 2012 03 01 5 Blo
  • 如果 Row1 = 值 1,则更新其他行

    我有一个小的 php 脚本 用于访问 mySql 数据库 我想在数据库中插入新记录之前查看该数字 值 1 是否等于数据库中的记录 这也在第 1 行 所以我想 查看传入的电话号码是否等于数据库中的电话号码 如果是这样 则必须保持电话号码相同的
  • 无法在 Mac 上启动 MySQL

    使用 Brew 安装后 我无法运行 MySQL 我使用的是 OS X El Capitan 版本 10 11 3 和 MySQL Server 版本 5 7 11 当我启动服务器时 我收到 启动 MySQL 错误 服务器退出而不更新 PID
  • MySQL中如何声明变量?

    如何在mysql中声明一个变量 以便我的第二个查询可以使用它 我想写一些类似的东西 SET start 1 SET finish 10 SELECT FROM places WHERE place BETWEEN start AND fin
  • 在 jQuery AJAX 成功中从 MySql 获取特定响应

    好吧 我有这个 ajax 代码 它将在 Success 块中返回 MySql 的结果 ajax type POST url index php success function data alert data My Query sql SE
  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam
  • 如何检测Mysql/innodb中的死锁?

    我知道在 Innodb 中使用事务时不可避免地会发生死锁 并且如果应用程序代码正确处理死锁 它们是无害的 正如手册所说 只需再试一次 所以我想知道 如何检测死锁 死锁是否会发出一些特殊的 mysql 错误号 如果重要的话 我正在使用 PHP
  • MYSQL - 使用逗号分隔字符串作为变量输入的存储过程

    我希望有人能够提供帮助 我已经创建了我的第一个存储过程 没什么花哨的 但是我遇到了问题 我想给它一个字符串输入 例如 1 2 3 4 5 然后它执行一个简单的操作SELECT FROM TABLE WHERE EAN IN VAR 所以存储
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • 学说迁移后备

    我们正在使用原则迁移 当迁移包含多个操作并且其中一个操作失败时 通常会出现问题 例如 如果迁移添加了 5 个外键 其中第 5 个失败 而字段长度不同 则修复字段错误并重新生成迁移不会not修复整个问题 而现在出现一个与 4 个密钥已存在有关
  • Mysql插入表后不显示右单引号(’)

    我有一个名为 测试 的表 我插入了一行 其中包含unicode字符右单引号 0x2019在名称字段中 SQL insert into Testing values Sno Name Address insert into Testing v

随机推荐

  • ASP.NET MVC 5 ajax 错误状态文本始终为“错误”

    我在向 ajax 调用发送错误自定义消息时遇到问题 我的控制器返回如下内容 return new HttpStatusCodeResult 400 My error 我的 ajax 代码如下所示 error function xhr htt
  • dateFromString 更改后 24 小时返回 nil

    NSDateFormatter timeFormat NSDateFormatter alloc init timeFormat setDateFormat hh mm a NSDate sourceDate timeFormat date
  • 在 JNI 中返回多维数组

    我想将一个已经存在的多维数组从 C 返回到 Java 代码 我的代码如下 int cells 3 3 0 int Java com packagename appname GameView addNew JNIEnv env jobject
  • 三.js概述

    是否可以使用 Three js 在我的 3D 模型上显示黑色轮廓 我想要看起来像 无主之地 2 的图形 卡通阴影 黑色轮廓 我确信我来晚了 希望这能解决稍后某人的问题 这是交易 您不需要渲染一切两次 开销实际上并不大 您所需要做的就是复制网
  • PHP DOMDocument 没有 DTD、head 和 body 标签?

    是否可以使用 DOMDocument 类但不允许它添加 doc 类型声明 head 和 body 标记 我正在为服务器端包含编写当前的代码 并且它正在呈现在已经格式良好的页面上 我不需要额外的标签 Wrikken 所说的或者 对于 PHP
  • 使用 2 个日期参数之间(含)之间的日期填充临时表的最简单方法

    使用包含两个日期参数和两个日期参数之间的日期填充临时表的最简单方法是什么 我只需要该月日期的第一天 例如 如果 StartDate 2011 01 01 和 EndDate 2011 08 01 然后我希望将其返回到表中 2011 01 0
  • 在 UITableViewCell 和 UITableViewController 之间传递数据?

    我在 xcode 4 6 中创建了主详细信息模板项目 并添加了带有 2 个文本字段的自定义单元格 我还创建了新类 它是 UITableViewCell 的子类 在这个类中我创建了文本字段的出口 当用户键入某些内容时 NSMutableArr
  • 丢弃限定符错误

    对于我的 compsci 类 我正在实现一个 Stack 模板类 但遇到了一个奇怪的错误 Stack h 在成员函数 const T Stack
  • MySQL SELECT 唯一列,其中其他列是最大的

    我有这样的桌子 id serial num version 1 1 1 2 2 1 3 2 2 4 3 1 5 4 1 6
  • 有没有办法“逃避”ElasticSearch 停用词?

    我对 ElasticSearch 相当陌生 有一个关于停用词的问题 我有一个索引 其中包含美国的州名 例如 纽约 纽约 加利福尼亚 加利福尼亚 俄勒冈 俄勒冈 我相信俄勒冈州的缩写 OR 是一个停用词 因此当我将州数据插入索引时 我无法搜索
  • Python - 使用列表创建字典

    我在列表中有以下字符串 并且能够使用该列表作为字典中的键并分配默认值 来创建字典 当我打印时 我看到字典是按照列表中字符串的相反顺序创建的 为什么会发生这种情况以及如何纠正它 是否需要反向语法 a hello bye tc iam crea
  • 由于 CORS 问题,无法从 Azure APIM 后面的网页调用 API

    我正在使用 Azure APIM 我的 API 托管在由 net core 编码的 Azure 应用服务上 我已经在 APIM 后面配置了我的 api 然而 当我尝试调用我的 API 时 我遇到了这个问题 访问从原点 获取 http 本地主
  • PHP,来自字符串的虚拟文件,无需写入硬盘

    如果我有一个字符串 包含pdf文件 可以制作一个 虚拟 文件以避免在硬盘上写入 以便稍后在需要现有文件的函数上使用 theorical code file stringToVirtualFile string require file Yo
  • 如何在 QLineEdit 中使用 std::string ?

    我有以下问题 我正在尝试将我编写的大量代码与 Qt 界面集成 我的一些函数返回std string 我没有成功制作QLineEdit setText接受它们 其他函数返回char不要给我带来问题 我应该怎么办 谢谢 朱塞佩 尝试这个 std
  • 未捕获的语法错误:JSON 中位置 0 处出现意外标记 u

    仅在结帐和单个产品页面上 我在控制台日志中收到以下错误 VM35594 1 Uncaught SyntaxError Unexpected token u in JSON at position 0 at JSON parse
  • 如何删除推送通知API

    Apple 在提交 iOS 应用程序时发送以下电子邮件 缺少推送通知权利 您的应用程序似乎包含用于注册 Apple 推送通知服务的 API 但应用程序签名的权利不包括 aps environment 权利 如果您的应用程序使用 Apple
  • 将简单注射器与 Umbraco 控制器结合使用

    我试图将依赖项注入到继承自 Umbraco 的 RenderMvcController 的控制器中并收到错误 找不到 RenderMvcController 类型的注册 并且无法进行隐式注册 为了让容器能够创建 RenderMvcContr
  • nums[:] = nums[::-1] 和 nums = nums[::-1] 之间的区别[重复]

    这个问题在这里已经有答案了 我目前正在学习 Python 并且遇到了分配列表的问题 In def nextPermutation self nums List int gt None 我有一行代码可以反转列表 如下所示 nums nums
  • 二维数组动态内存分配崩溃[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 C 中正确设置 访问和释放多维数组 我正在尝试使用 calloc 为 2D 数组动态分配内存 列固定为 2 因此只有行是动态的 这是我一直在尝试的 unsigned int pts rows
  • 每个关键字的前 'n' 个结果

    我有一个查询 要获取对特定关键字发表评论的前 n 个用户 SELECT user COUNT AS magnitude FROM results WHERE keyword economy GROUP BY user ORDER BY ma