mysql查询:如何获取按最新提交日期排序的趋势帖子

lhcgjxsq  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(375)

我正在尝试获取最新的趋势帖子,这些帖子应该是具有最多视图的帖子,为此,我使用以下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

posts表结构:

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\u视图表结构:

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

vaj7vani

vaj7vani1#

在所有的评论最终提供了一个更明确的你想要什么之后,我将首先只获得那些在你首先关心的时间段内的post id。这个独特的列表可以加入到主“posts”表中,这样您就不会浪费时间去计算在几周、几个月甚至几年内没有活动的id的记录了。。
另外,由于您没有为post\u views表提供任何表结构,因此我必须假设条目具有日期/时间。。。您可以有一篇文章,但有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个与查询相关联的列,只显示重要的列就可以得到您的答案。

svujldwt

svujldwt2#

如果您希望输出上周提交的文章列表及其视图计数(按提交日期降序排列),则:

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 子句,例如 LIMIT 50 前50排。
另一种选择是只显示至少有n个视图的帖子,其中 HAVING 条款:

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

相关问题