繁体   English   中英

Mysql选择上周每天的用户帖子总数

[英]Mysql select total Count of posts of a user day by day for last week

目前,我正在使用php / mysql和项目的一部分,我向用户显示他在网站上发布的帖子总数,今天的帖子数以及关注他的ppl数量

对于目前我正在做的

SELECT
(SELECT COUNT(*) FROM posts WHERE userId='{$u->id}) as totalposts,
(SELECT COUNT(*) FROM posts WHERE userId='{$u->id} and DATE(datePosted) = DATE(NOW())) as todayposts,
(SELECT COUNT(*) FROM user_follower WHERE followedId='{$u->id}') as myfollowers");

该查询给我3个帖子,共计帖子总数,今日帖子和关注用户的关注者总数

关键是我想在此数字旁边显示一个条形图 ,以代表过去一周的用户活动(曲线或条形图可以告诉用户他的下降幅度是否在增加等。)

此查询现在返回的示例

totalposts|todayposts|myfollowers|
100       | 4        | 300       |

但是因为我现在还需要条形图来显示他过去几天的帖子数。 我做到了

SELECT
          (SELECT COUNT(*) FROM posts WHERE userId=2) as tpT,
          (SELECT COUNT(*) FROM posts WHERE userId=2 and DATE(timePosted) <= DATE(NOW()) - INTERVAL 1 DAY ) as tp1,
          (SELECT COUNT(*) FROM posts WHERE userId=2 and DATE(timePosted) <= DATE(NOW()) - INTERVAL 2 DAY ) as tp2,
          (SELECT COUNT(*) FROM posts WHERE userId=2 and DATE(timePosted) <= DATE(NOW()) - INTERVAL 3 DAY ) as tp3,
          (SELECT COUNT(*) FROM posts WHERE userId=2 and DATE(timePosted) <= DATE(NOW()) - INTERVAL 4 DAY ) as tp4,
          (SELECT COUNT(*) FROM posts WHERE userId=2 and DATE(timePosted) <= DATE(NOW()) - INTERVAL 5 DAY ) as tp5,
          (SELECT COUNT(*) FROM posts WHERE userId=2 and DATE(timePosted) <= DATE(NOW()) - INTERVAL 6 DAY ) as tp6,
          (SELECT COUNT(*) FROM posts WHERE userId=2 and DATE(timePosted) <= DATE(NOW()) - INTERVAL 7 DAY ) as tp7,
          (SELECT COUNT(*) FROM posts WHERE userId=2 and DATE(timePosted) = DATE(NOW())) as tdvT

Result
tpT|tp1|tp2|tp3|tp4|tp5|tp6|
100|96 | 90| 90| 89|80 |64 |

其中tps(1)代表WHERE帖子是在当前日期-1天之前发布的。

那我该如何在语句中循环呢? 还是我应该那样保留它?

目前,它不会造成太大的麻烦。 0.0008秒的执行时间非常棒。

还有更好的方法吗?

我看起来很蠢:p

提前致谢

编辑

对于未来的谷歌人。

我最终做了

$v=$this->db->query("SELECT count(*) as count,date(timePosted) as day FROM `posts` where userId = {$u->id} group by date(timePosted)");

$pts=[];

for($i=0; $i <= 6; $i++){
    $pts[date('Y-m-d',strtotime(date('Y-m-d')."- $i Day"))]='0';
    $vs[date('Y-m-d',strtotime(date('Y-m-d')."- $i Day"))]='0';
}

foreach($v->result() as $s){
if(isset($vs[$s->day]))$vs[$s->day]=$s->count;
}

所以我最终还是让php为执行时间着手处理它。

我将通过以下示例进行更改。 通过select(),SQLVars将在加入“ posts”表之前的每一天进行一次预计算。 现在,SUM(case / when)仅需要与“ @Day?”进行比较。 值。 由于所有操作都是针对同一用户的,因此我将其放在where子句中,因此不需要考虑其他任何人。

现在,我注意到您所拥有的一件事,并且不知道它是否是有意的。 但是,由于您每次都在重新查询确切的行集,但是对于不同的<=日期范围,所有的计数都将是前一个的增量。 例如:1天前的所有行将至少是7 + 6 + 5 + 4 + 3 + 2天前的所有行。 2天前的类似产品至少会在7 + 6 + 5 + 4 + 3天之前提供。

select
      count(*) tpT,
      sum( case when date(p.timePosted) = @Day0 then 1 else 0 end ) as tdvT,
      sum( case when date(p.timePosted) <= @Day1 then 1 else 0 end ) as TP1,
      sum( case when date(p.timePosted) <= @Day2 then 1 else 0 end ) as TP2,
      sum( case when date(p.timePosted) <= @Day3 then 1 else 0 end ) as TP3,
      sum( case when date(p.timePosted) <= @Day4 then 1 else 0 end ) as TP4,
      sum( case when date(p.timePosted) <= @Day5 then 1 else 0 end ) as TP5,
      sum( case when date(p.timePosted) <= @Day6 then 1 else 0 end ) as TP6,
      sum( case when date(p.timePosted) <= @Day7 then 1 else 0 end ) as TP7
   from
      posts p,
      ( select @Day0 := date( now()),
               @Day1 := date_add( date(now()), interval -1 day ),
               @Day2 := date_add( date(now()), interval -2 day ),
               @Day3 := date_add( date(now()), interval -3 day ),
               @Day4 := date_add( date(now()), interval -4 day ),
               @Day5 := date_add( date(now()), interval -5 day ),
               @Day6 := date_add( date(now()), interval -6 day ),
               @Day7 := date_add( date(now()), interval -7 day ) ) SQLVars
   where 
      p.userID = 2

如果您真正想要的是多少实际帖子,例如:从今天,一天前,两天前,三天前,您就必须调整查询以将<=删除为仅“ =”

例如:假设接下来一周的实际职位活动。

Even before this Sunday,    Sun  Mon  Tue  Wed  Thu  Fri Sat
 200                         10   20   30   20   10   50  60


Using the <= approach your 
TP1 (representing Saturday 1 day ago) would be 400.  
TP2 (2 days ago -- Friday and prior) would be 340, 
TP3 (3 days ago -- Thursday and prior) would be 290, etc

如果您希望图表显示出来(在此示例中),则每天都有各自的计数,只需将其从“ <=”更改为“ =“。

总体而言,它与每次处理每个字段的查询略有不同。 此查询过程1记录并说明所有列结果值。 这是您拥有的解决方案的另一种选择。 我不知道性能对这么小的桌子有什么影响,但是如果您的某人的活动后活动数为1000,则可能更可衡量。

您可以简化您的sql并改用它。 它会为您提供按日期降序发布的所有帖子数。 因此,您将拥有过去7天的所有帖子。 现在,在您的应用程序登录名中,您只需要处理这些数据。 这将简化您的sql并使其高效执行。

    select count(*)
    from posts
    where userId=2
    group by DATE(timePosted)
    order by DATE(timePosted) desc
    limit 7

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM