mysql - 如何显示每个类别中查看次数最多的帖子?
问题描述
首先,我不将此代码用于 wordpress 网站,我希望将其代码放入我自己的网站。所以现在我有问题,我想显示每个类别中浏览次数最多的帖子,
我有桌子 => 帖子
content || category || views
-------------------------------
text 1 | cat1 | 700
text 2 | cat2 | 900 <==== most views in cat 2
text 3 | cat2 | 900
text 4 | cat1 | 900 <==== most views in cat 1
text 5 | cat1 | 800
text 6 | cat2 | 800
text 7 | cat3 | 700 <==== most views in cat 3
text 8 | cat2 | 900
text 9 | cat3 | 100
text10 | cat1 | 100
我想要这样的输出:
content || category || views
-------------------------------
text 4 | cat1 | 900
text 2 | cat2 | 900
text 7 | cat3 | 700
解决方案
将您的表加入到GROUP BY
子查询中,该子查询会为每个类别找到最受欢迎的帖子:
SELECT t1.*
FROM yourTable t1
INNER JOIN
(
SELECT category, MAX(views) AS max_views
FROM yourTable
GROUP BY category
) t2
ON t1.category = t2.category AND t1.views = t2.max_views;
如果给定类别可能有多个帖子与相同数量的视图相关联,那么理想情况下,您应该为我们提供如何打破平局的逻辑。在这种情况下,上述查询将返回所有已绑定的帖子。
如果您使用的是 MySQL 8+,那么我们可以使用ROW_NUMBER
(或者可能是一个RANK
函数):
SELECT
content, category, views
FROM
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY category ORDER BY views DESC) rn
FROM yourTable
) t
WHERE rn = 1;
推荐阅读
- r - 与多列匹配的字符串以在 r 中查找可能的结果
- prolog - 在 Mac 中输出序言
- php - CORS 在我的电脑上工作没有错误,但不能在任何其他设备上工作
- r - 迭代地将包含字符和数字的行添加到数据框中
- javascript - 为现有 JSDOC 注释的 commonJS 库创建 Typescript 声明文件
- angular - 在前一个关闭后一个一个打开几个 mat-dialogs
- azure - Azure 启动 2 个自托管服务器将文件交付到池中的 Azure 托管代理,但只有 1 个接受 copyfiles 任务
- javascript - 用纯 JS 在另一个 JS 文件中包含一个 JS 文件
- laravel - 分组或操作 laravel 集合
- linux - nginx + ssh_exchange_identification:连接被远程主机关闭