mysql最热门类别中最热门的文章[关闭]

Posted

技术标签:

【中文标题】mysql最热门类别中最热门的文章[关闭]【英文标题】:mysql most popular articles in most popular categories [closed] 【发布时间】:2014-10-17 19:07:17 【问题描述】:

我有“文章表”:

id,
category_id

分类表:

id

查看计数表:

id,
article_id,
ip,

我需要的是 mysql 查询,它将给出 5 个类别的文章总浏览次数最多(最常阅读的类别)。另外,每个类别中必须是查看次数最多的文章列表(最常阅读该类别中的 5 篇文章)

所以查询应该返回如下内容:

sport, article1
sport, article2
sport, article3
sport, article4
sport, article5
tv, article6
tv, article7
tv, article8
tv, article9
tv, article10
etc...

另外,有多少次文章和类别被观看会很棒,但这不是必需的。

我已经尝试过计数所有但没有成功。 问候。

【问题讨论】:

你一定尝试过。尝试修改您的问题。 我也没有看到与 php 的任何关系,也没有代码 【参考方案1】:

要在 MySQL 中执行此操作,您必须模仿 row_number() over(按类别分区)功能,否则其他数据库中将提供该功能。

我在这里使用一些示例数据测试了下面的查询:

菲德:

http://sqlfiddle.com/#!9/2b8d9/1/0

查询:

select id, category_id
from(
select x.*,
       @row_number:=case when @category_id=x.category_id then @row_number+1 else 1 end as row_number,
       @category_id:=x.category_id as grp
  from (select art.id, art.category_id, count(*) as num_art_views
          from articles art
          join (select art.category_id, count(*)
                 from view_counts cnt
                 join articles art
                   on cnt.article_id = art.id
                group by art.category_id
                order by 2 desc limit 5) topcats
            on art.category_id = topcats.category_id
          join view_counts cnt
            on art.id = cnt.article_id
         group by art.id, art.category_id
         order by art.category_id, num_art_views desc) x
 cross join (select @row_number := 0, @category_id := '') as r
) x where row_number <= 5

为了澄清,这将显示前 5 个类别中的前 5 篇文章。

使用 LIMIT 足以获得前 5 个类别,但要获得每个类别中的前 5 篇文章,您必须通过使用在每次类别更改时重新启动的变量来模仿其他数据库的 PARTITION BY。

如果您只运行内部部分,这可能有助于理解,请参见此处的小提琴: http://sqlfiddle.com/#!9/2b8d9/2/0

此时的输出是:

|        ID | CATEGORY_ID | NUM_ART_VIEWS | ROW_NUMBER |    GRP |
|-----------|-------------|---------------|------------|--------|
| article16 |       autos |             2 |          1 |  autos |
| article14 |      planes |             2 |          1 | planes |
| article12 |       sport |             4 |          1 |  sport |
|  article3 |       sport |             3 |          2 |  sport |
|  article4 |       sport |             3 |          3 |  sport |
|  article1 |       sport |             3 |          4 |  sport |
|  article2 |       sport |             3 |          5 |  sport |
|  article5 |       sport |             2 |          6 |  sport |
| article15 |      trains |             2 |          1 | trains |
| article13 |          tv |             6 |          1 |     tv |
|  article9 |          tv |             3 |          2 |     tv |
|  article6 |          tv |             3 |          3 |     tv |
|  article7 |          tv |             3 |          4 |     tv |
|  article8 |          tv |             3 |          5 |     tv |
| article10 |          tv |             2 |          6 |     tv |

此时您可以轻松排除任何不

【讨论】:

非常感谢。它看起来有点复杂,但效果很好。 没问题,很高兴它正在工作

以上是关于mysql最热门类别中最热门的文章[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 查找所有帖子并获取最热门的类别

是一个热门编码是免费的虚拟陷阱[关闭]

在帝国cms中,怎么调用所有新闻系统中的最新文章,热门文章。是否用灵动标签呢。

2018年最热门的JavaScript开源项目!

2020年3月Github上最热门的开源项目

全网最全最热门的Spring AOP面试题及答案。