Красноречивый стол на дату

Схема таблицы кликов:

user_id as (integer)
created_at as (Y-m-d H:i:s)

Таблица просмотров

user_id as (integer)
created_at as (Y-m-d H:i:s)

Мне нужно посчитать записи в 1-й таблице + 2-й таблице групп по дате, а не по дате и времени:

Сейчас я использую 2 запроса:

$clicks = $user->clicks()
->select(\DB::raw("DATE_FORMAT(created_at, '%d/%m/%Y') as date"),
\DB::raw("COUNT(*) as clicks"))
->groupBy('date')
->orderBy('date', 'ASC')
->get()->toArray();

$views = $user->views()
->select(\DB::raw("DATE_FORMAT(created_at, '%d/%m/%Y') as date"),
\DB::raw("COUNT(*) as views"))
->groupBy('date')
->orderBy('date', 'ASC')
->get()->toArray();

И после того, как у меня есть петля

$out = [];
for ($i=0; $i < count($views); $i++) {
$out[] = [
'date' => $views[$i]['date'],
'clicks' => $clicks[$i]['clicks'],
'views' => $views[$i]['views']
];
}

Но таким образом, если щелчок существует и просмотр нет на какую-то дату, он не добавит его в массив
Можно присоединиться по create_at по формату даты? без времени?

2

Решение

Так как MySQL не поддерживает полное соединение, попробуйте это

select date(clicks.created_at)as 'Date',
count(clicks.user_id) as 'clicks',
count(views.user_id)as 'views'
from clicks
left join views on date(views.created_at)=date(clicks.created_at)
group by date(clicks.created_at)

union

select date(views.created_at)as 'Date',
count(clicks.user_id) as 'clicks',
count(views.user_id)as 'views'
from views
left join clicks  on date(views.created_at)=date(clicks.created_at)
group by date(views.created_at)

так как в вашем запросе есть количество, попробуйте этот запрос

select a.Date,a.clicks,b.views
from(select date(clicks.created_at)as 'Date',
count(clicks.user_id) as 'clicks'
from clicks
group by date(clicks.created_at))a
left join (select date(views.created_at)as 'Date',
count(views.user_id) as 'views'
from views
group by date(views.created_at))b
on a.date=b.date

union

select a.Date,b.clicks,a.views
from(select date(views.created_at)as 'Date',
count(views.user_id) as 'views'
from views
group by date(views.created_at))a
left join (select date(clicks.created_at)as 'Date',
count(clicks.user_id) as 'clicks'
from clicks
group by date(clicks.created_at))b
on a.date=b.date
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]