我在mysql Post表和post_activity表中有两个表 发表如下
Post_Id Post Post_Date
-----------------------------------------------
1 sample post 1 2015-05-01
2 sample post 2 2015-06-01
3 sample post 3 2015-06-02
-----------------------------------------------
这些帖子显示在一个页面中,用户可以查看,评论和喜欢这些帖子,这些活动存储在post_activity表中,如下所示
Act_id Post_Id Activity Act_date
-----------------------------------------------------
1 1 commented 2015-07-01
2 1 viewed 2015-07-01
3 2 viewed 2015-07-01
4 2 viewed 2015-07-01
5 2 liked 2015-07-01
6 2 commented 2015-07-01
7 1 viewed 2015-07-02
8 3 viewed 2015-07-03
9 3 commented 2015-07-03
10 2 viewd 2015-07-03
11 2 commented 2015-07-03
12 2 viewd 2015-07-03
13 1 viewd 2015-07-03
-----------------------------------------------------
我希望在用户访问该页面的当天按最近活动计数显示帖子,如果没有活动,那么它将根据前一天的活动显示等等 结果示例如下
在02-07-2015访问网站时,帖子将按以下顺序显示
Sample Post 1
Sample Post 2
Sample Post 3
因为活动在2015年2月2日仅在post1上完成所以它是第一个,基于之前的日期活动计数来继续
在03-07-2015访问网站时,帖子将按以下顺序显示
Sample Post 2
Sample Post 3
Sample Post 1
因为大多数活动都是在2015年3月3日在post2上完成的,所以它首先出现,接下来大部分活动都在第3期进行,所以它排在第2位等
在04-07-2015访问网站时,由于在04-07-2015没有活动,将在03-07-2015的顺序显示
建议我编写最好的mysql select查询来获得所需的输出
答案 0 :(得分:1)
尝试以下查询
select post,act_date from
(
select post,act_date,count(*) as cnt
from post p inner join post_Activity pa on pa.post_id = p.post_id
group by act_date,post_id
) t
order by act_date desc,cnt asc
答案 1 :(得分:1)
这不是一个完整的答案,但希望它会成为一个指导。
下面的查询将计算在帖子和订单上完成的活动(查看,喜欢,...)的数量,并根据特定日期(当天用户访问该页面)显示
SELECT `post`.`post` , COUNT( `post_activity`.`post_id` ) AS 'number_of_act_on_post'
FROM `post`
LEFT JOIN `post_activity` ON `post`.`post_id` = `post_activity`.`post_id`
WHERE `post_activity`.`act_date` = '2015-07-03'
GROUP BY `post_activity`.`post_id`
ORDER BY `number_of_act_on_post` DESC
如您所见,您可以通过上述查询获得“2015-07-03”日期的预期结果。但是对于'2015-07-02',它只输出一条记录(样本帖1),因为那个日期只有一条记录。对于像'2015-07-04'这样的日期,查询将返回空结果,因为在'post_activity'表中该日期下没有记录。如果您能解决这两个问题,那么您就得到了答案。