我正在尝试创建一个页面,其中显示前10位用户以及前10位用户总共有多少篇文章,该用户在过去30天,90天和180天内有多少篇文章。
根据文章总数检索前10位用户,这应该是默认排序。对于30,90和180天的统计数据,他们应该为这10个相同的用户。
我不知道怎么做是为这十个用户获取所有这些信息,按总计排序,然后显示其余的。
数据库中没有任何内容存储30天,90天和180天,因此必须根据日期范围计算它们。
有一个用户表和一个带有userid关系的商品表,而商品表上有一个创建每件商品的日期。
查询将根据总文章找到前10位用户,然后计算在该时间范围内创建的30,90和180篇文章。然后我就可以在一个html表中提供它。
感谢。
编辑:如何呈现数据的示例:http://i.imgur.com/BjALeHZ.png
答案 0 :(得分:0)
假设您有多对多关系表user_articles
包含以下列(userid, articleid)
。
您的文章表可能包含date_issued date datatype
列。
要访问当天的用户前10名。
Select count(ua.articleid), ua.userid
from user_articles ua, articleid a
where ua.articleid = a.articleid
group by ua.userid, a.date_issued
order by 1
limit 10;
获取用户过去30天的文章总数
select sum(article_count), userid
from (Select count(ua.articleid) as article_count, ua.userid, a.date_issued
from user_articles ua, articleid a
where ua.articleid = a.articleid
group by ua.userid, a.date_issued
order by 1
limit 10)
where date_issued between curdate()-30 and curdate()
group by userid;
要获取用户在过去90天内的总用户文章,只需更改
即可where date_issued between curdate()-30 and curdate()
到
where date_issued between curdate()-90 and curdate()
你将会做180天。
答案 1 :(得分:0)
此单个查询选择内联视图(top_10_users
)中的前10个用户,对于这些用户,使用CASE语句计算文章数。如果日期差异在特定范围内,则将1添加到SUM中,从而获得该日期范围内的记录数。
select
u.user_name User,
count(*) Total_Posts,
SUM(
CASE
WHEN DATEDIFF(CURDATE(), created_date) < 31 THEN 1
ELSE 0
END
) Posts_Last_30_days,
SUM(
CASE
WHEN DATEDIFF(CURDATE(), created_date) BETWEEN 31 AND 90 THEN 1
ELSE 0
END
) Posts_Last_90_days,
SUM(
CASE
WHEN DATEDIFF(CURDATE(), created_date) BETWEEN 91 AND 180 THEN 1
ELSE 0
END
) Posts_Last_180_days
from
(
select user_id, count(article_id) cnt_articles
from user_articles
group by user_id
order by count(article_id) desc
limit 10
) top_10_users
inner join user_articles ua on top_10_users.user_id = ua.user_id
inner join users u on ua.user_id = u.user_id
group by u.user_name
order by count(*);