根据原始SQL结果获取额外数据

时间:2014-06-24 03:22:59

标签: php mysql sql

我正在尝试创建一个页面,其中显示前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

2 个答案:

答案 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(*);

SQL Fiddle demo