mariadb 如何使用Raw SQl / Laravel - Eloquent ORM进行累积计数

omhiaaxx  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(119)

这更像是一个SQL问题,而不是一个Laravel问题。
我想基于我的User模型,使用created_at字段完成类似下面的操作。(数据库中的表users)
| 创建时间|用户标识|
| - -|- -|
| 2022年4月30日|一个|
| 2022年5月2日|2个|
| 2022年5月3日|四个|
| 日期|创建的用户(到此日期)|到目前为止创建的用户总数|
| - -|- -|- -|
| 2022年至2004年|一个|一个|
| 2022年5月|2个|三个|
有什么办法吗?
到目前为止,我已完成的工作(使用Eloquent ORM):

User::query()
   ->selectRaw("COUNT(*) created_users_to_this_date, DATE_FORMAT(created_at, '%Y-%m') date")
   ->orderBy('date')
   ->groupBy('date')
   ->get();

等效SQL请求

select COUNT(*) created_users_to_this_date, DATE_FORMAT(created_at, '%Y-%m') date from `users` where `users`.`deleted_at` is null group by `date` order by `date` asc

因此返回
| 日期|创建的用户(到此日期)|
| - -|- -|
| 2022年至2004年|一个|
| 2022年5月|2个|
我感谢你的帮助

quhf5bfb

quhf5bfb1#

如果你的mysql版本支持窗口函数,你可以试着用SUM窗口函数来做累计计数

DB::table(DB::raw('(select COUNT(*) created_users_to_this_date, DATE_FORMAT(created_at, \'%Y-%m\') date 
    from `users` 
    where `users`.`deleted_at` is null 
    group by `date`) t1'))
->select('created_users_to_this_date','date',DB::raw('SUM(created_users_to_this_date) OVER(ORDER BY date) total_users_created_to_date'))
->get();
ghg1uchk

ghg1uchk2#

您的等效sql将是

SELECT DATE ,
  @running_number:=@running_number+created_users_to_this_date AS created_users_to_this_date
   FROM (SELECT 
  COUNT(*) AS created_users_to_this_date,
  DATE_FORMAT(created_at, '%Y-%m') DATE
FROM
  users 
where users.deleted_at is null 
GROUP BY `date` 
ORDER BY `date` ASC ) final
JOIN (SELECT @running_number:=0) rn
g6ll5ycj

g6ll5ycj3#

User::query()
 ->select('
 DB::raw('COUNT(DATE_FORMAT(created_at, \'%Y-%m\') = DATE_FORMAT(now(), \'%Y-%m\')) as created_users_to_this_date'),
 DB::raw('COUNT(DATE_FORMAT(created_at, \'%Y-%m\') <= DATE_FORMAT(now(), \'%Y-%m\')) as total_users_created_to_date'),
 DB::raw('DATE_FORMAT(created_at, '%Y-%m') as date')
 ')->orderBy('date')->groupBy('date')->get();

相关问题