【问题标题】:MySQL query: How to get the trending posts ordered by latest submission dateMySQL 查询:如何获取按最新提交日期排序的热门帖子
【发布时间】:2019-06-03 12:25:28
【问题描述】:

我正在尝试获取最新的热门帖子,这些帖子应该是具有最高查看次数的帖子,为此我正在使用以下 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 是 Post 提交日期。

这个查询应该是获取最新(最高查看)的帖子,但不幸的是,我从这个查询中得到的结果总是帖子之间最高的 Views,不管帖子有多旧查看次数较多。

我需要查询以获取按查看次数排序的一个月内添加的帖子,然后根据每个帖子的提交日期重新排序。该列表应首先显示查看次数较多但提交日期较新的帖子。一个案例场景是一个帖子,它不在视图数量之上,因为它是一个新帖子,但具有挑战性的视图数量。 ,如:

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_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

【问题讨论】:

  • 所以您只想要 x 个结果,即观看次数最多的结果,但按日期顺序排列?或者究竟是什么?如果是这样,那么按视图排序,限制,做成子查询并按日期排序
  • 但是“最高而新”的确切定义是什么?
  • 如果可能的话,我需要它在一个查询中。我需要查询以获得最新提交的帖子中浏览量最高的帖子。
  • 您必须定义“最新”。它需要是您可以具体定义的东西。上个星期?上个月?去年?根据年龄来衡量观看次数?首先找出一个数学或逻辑公式来定义它应该如何确定
  • 我的意思是最近的“上周”,是的,我应该根据帖子的年龄来衡量观看次数吗?

标签: mysql date join sql-order-by having-clause


【解决方案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

另一种选择是仅显示具有至少 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

【讨论】:

    【解决方案2】:

    在所有 cmets 最终提供了您想要的更明确的内容之后,我将首先仅获取您首先关心的时间段内的那些帖子 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 与查询相关联,只显示对获得答案的重要性。

    【讨论】:

    • 如果查询中没有使用 OriginalPostDate 是什么意思?
    • 我需要查询一个月内添加的帖子,按浏览量排序,然后根据每个帖子的提交日期重新排序。该列表应首先显示查看次数较多但提交日期较新的帖子。一个案例场景是,一个帖子不是在观看次数之上的,因为它是一个新帖子,但具有挑战性的观看次数。
    猜你喜欢
    • 2020-11-28
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多