簡體   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