MySQL查询:如何获取按最新提交日期排序的热门帖子

时间:2019-01-08 19:03:27

标签: mysql

我正在尝试获取最新趋势的帖子,这些帖子应该是具有最高查看次数的帖子,为此,我正在使用以下MySQL查询:

SELECT 
    p.id,
    p.date,
    COUNT(v.post_id) views 
FROM 
    posts p 
    JOIN posts_views v ON v.post_id = p.id 
GROUP BY v.post_id 
ORDER BY views DESC, p.date DESC

posts.date是帖子提交日期。

该查询应该获得最新(浏览量最高)的帖子,但是不幸的是,无论该帖子有多旧,我从该查询中获得的结果始终是帖子之间的最高观看次数 观看次数的次数较多。

我需要查询以获取在一个月内添加的帖子(按视图数排序),然后根据每个帖子的提交日期对它们重新排序。该列表应首先显示具有更高视图数但提交日期较新的帖子。一个案例场景是,一个职位不位于视图总数之上的职位将是第一个,因为它是一个新职位,但具有很大的视图数量。 ,例如:

ORDER  ID   VIEWS   DATE
1      23   55      2018/12/01
2      45   77      2018/07/07
3      14   45      2018/06/05

帖子表结构:

id   title   date
65   Lorem ipsum dolor sit amet 2    1543346735
67   Lorem ipsum dolor sit amet 3    1543346256
66   Lorem ipsum dolor sit amet 4    1543346253
68   Lorem ipsum dolor sit amet 5    1543376617

posts_views 表结构:

id   post_id  ip            date
1    65       44.55.36.13   1543346735
5    67       46.54.36.51   1543347256
4    66       43.55.36.51   1543347253
6    68       48.66.36.01   1543377617

2 个答案:

答案 0 :(得分:1)

如果,您要输出上周提交的帖子列表及其查看次数(按提交日期降序排列),然后:

SELECT p.id, p.date, COUNT(v.post_id) views 
FROM posts p 
INNER JOIN posts_views v ON v.post_id = p.id 
WHERE p.date > NOW() - INTERVAL 1 WEEK
GROUP BY v.post_id 
ORDER BY p.date DESC

您可能希望通过在查询的末尾添加LIMIT子句来限制结果的数量,例如前50行的LIMIT 50

另一种选择是仅显示具有HAVING子句的至少 N 个视图的帖子:

SELECT p.id, p.date, COUNT(v.post_id) views 
FROM posts p 
INNER JOIN posts_views v ON v.post_id = p.id 
WHERE p.date > NOW() - INTERVAL 1 WEEK
GROUP BY v.post_id 
HAVING COUNT(v.post_id) > 10
ORDER BY p.date DESC

答案 1 :(得分:1)

在所有评论最终提供了您想要的更明确的信息之后,我将首先获取那些您最关心的时间段内的帖子ID。然后,可以将这个独特的列表添加到主“职位”表中,这样您就不会浪费时间在几周,几个月甚至几年内没有任何活动的ID记录。

此外,由于您没有为post_views表提供任何表结构,因此我不得不假设该条目具有日期/时间...您可以发表1条帖子,但是几天内有30个人查看,因此您可能在该表上有一个日期-假设这样的列名

select
      PQ.Post_ID,
      PQ.ViewCount,
      PQ.MostRecentViewDate,
      P.Date as OriginalPostDate  
   from
   ( select 
           v1.post_id,
           count(*) as viewCount,
           max( pv.viewDate ) as MostRecentViewDate
        from
           post_views pv
        where
           pv.viewDate >= now() - Interval 1 week
        group by
           pv.post_id 
        having
           count(*) > 10
        order by
           count(*) desc ) PQ
      JOIN posts p
         on PQ.Post_ID = P.id

为了将来,发布对阐明您的观点至关重要的表结构也很好。如果您有50列,则可能只需要显示3-4个与查询相关联的内容,而仅显示重要性即可获得答案。