【问题标题】:Getting Extra Data Based on Original SQL Result根据原始 SQL 结果获取额外数据
【发布时间】:2014-06-24 03:22:59
【问题描述】:

我正在尝试创建一个页面,显示前 10 位用户以及前 10 位用户总共拥有多少篇文章,以及该用户在过去 30 天、90 天和 180 天内拥有多少篇文章。

根据总文章检索前 10 个用户,这应该是默认排序。对于 30、90 和 180 天的统计数据,它们应该针对这 10 个用户。

我不知道该怎么做是获取这十个用户的所有这些信息,按总数排序,然后将其余的也显示出来。

数据库中没有存储 30、90 和 180 天的任何内容,因此必须根据日期范围计算它们。

有一个 user 表和一个 article 表,关系为 userid,article 表有每篇文章的创建日期。

该查询将根据总文章查找前 10 位用户,然后计算在该时间范围内创建的 30、90 和 180 篇文章。然后我就可以在 html 表格中呈现它了。

谢谢。

编辑:如何呈现数据的示例:http://i.imgur.com/BjALeHZ.png

【问题讨论】:

  • 你有这个场景的 sqlfiddle 吗?
  • 使用带有子查询的LEFT JOIN 再次为 30、90 和 180 计数添加表。
  • 这里是一个例子,它看起来如何i.imgur.com/BjALeHZ.png

标签: php mysql sql


【解决方案1】:

这个单一查询选择内联视图 (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

【讨论】:

    【解决方案2】:

    假设您有这个多对多关系表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 天内你会这样做。

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多