我有一个名为“ AdInteraction”的模型,这些交互可以是click
或view
(它们将boolean clicked
或boolean viewed
设置为true )。
我每次互动都保存了created_at
日期。
现在这就是我要得到的最终结果,以便拥有填充ChartJS图表所需的所有数据:
[
{
"date": "01-01-2018"
"clicks": 13,
"views": 25
},
{
"date": "02-01-2018"
"clicks": 25,
"views": 74
},
{
"date": "03-01-2018"
"clicks": 0,
"views": 0
},
]
这是我已经在与Ad
相关的AdInteraction
模型上得到的查询:
public function getClicksForLastDays()
{
return $this->clicks()->get()->groupBy(function($date) {
return Carbon::parse($date->created_at)->format('y-m-d');
});
}
但是这将返回一个数组,如下所示:
获取点击并按天数计数的正确,最有效的方法是什么?
答案 0 :(得分:1)
尝试一下,让我知道,我假设您的列名称为date,clicks,views
,如果它的名称不同,则请让我知道,所以我将调整答案,或者您可以自己完成。.
AdInteraction::select([DB::raw('DATE(date)'),DB::raw('count(case when clicks ="true" then 1 end) as "Clicks"'),
DB::raw('count(case when views ="true" then 1 end) as "Views"')])
->groupBy(DB::raw('DATE(date)'))
->get();
或尝试
AdInteraction::select([DB::raw('DATE(date)'),DB::raw('count(case when clicks =true then 1 end) as "Clicks"'),
DB::raw('count(case when views =true then 1 end) as "Views"')])
->groupBy(DB::raw('DATE(date)'))
->get();
答案 1 :(得分:0)
您应该考虑放弃使用datetime
列按GROUP BY DATE(created_at)
进行分组的想法,因为这种查询的效率非常低。例如,当您使用created_at
时,MySQL将为每一行执行此强制转换功能,并且将无法使用DATE created_date_at
的索引。
因此,我建议您通过为created_at
值引入单独的AdInteraction::creating(function ($adInteraction) {
$adInteraction->created_date_at = $adInteraction->created_at->format('Y-m-d');
});
列并为其创建索引来对表进行非规范化。然后,您将可以通过此新列值将统计信息有效地分组。只要确保为您的模型注册以下代码即可:
int
或者您可以考虑为年,月和日分别创建version: '3'
services:
postgres:
build: .
environment:
POSTGRES_PASSWORD: qwerty123456
POSTGRES_USER: postgres
#POSTGRES_DB: sample_db
volumes:
- ./pgdata:/var/lib/postgresql/data/
ports:
- "5433:5432"
healthcheck:
test: exit 0
Dockerfile:
FROM postgres:alpine
ADD ./init.sql /docker-entrypoint-initdb.d/
init.sql:
create database db_sample;
drop table if exists tbl_sample;
create table tbl_sample(s_id serial primary key,samp_name varchar(255))
列。然后,您可以创建一个多列索引并按这些列分组。这样,如果需要,您还可以按天,月和年轻松获取统计信息。