0

現在、私はphp/mysqlを使用しており、プロジェクトの一部として、彼がWebサイトに投稿した投稿の総数、今日の投稿の数、および彼をフォローしている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 つの数を示します

ポイントは、過去1週間のユーザーアクティビティを表すこの数値の横に棒グラフを表示したいということです(ユーザーが減少しているか増加しているかなどをユーザーに伝えることができる曲線または棒グラフ..)

このクエリが返す例

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) は、現在の日付 - 1 日より前に投稿された場​​所を表します。

ステートメントでそのようなループを行うにはどうすればよいですか?または私はそれをそのままにしておくべきですか?

現在のところ、大きな問題は発生していません。0.0008秒の実行時間なので素晴らしいです。

まだそれを行うより良い方法はありますか?

私は愚かに見えます:p

前もって感謝します

編集

将来の Google 社員のために。

私はやった

$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に処理させることになりました。

4

2 に答える 2