我正在尝试获取最新趋势的帖子,这些帖子应该是具有最高查看次数的帖子,为此,我正在使用以下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
答案 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个与查询相关联的内容,而仅显示重要性即可获得答案。