есть две таблицы
user
|id|user|
1 | kolya
2 | fedya
и data
в которую периодически записываются count
|user_id|data_time|count|
1 | 2019-04-26 15:41:55 | 8
2 | 2019-04-26 15:41:55 | 15
1 | 2019-04-26 15:28:55 | 25
2 | 2019-04-26 15:28:55 | 28
1 | 2019-04-25 15:20:55 | 6
2 | 2019-04-25 15:20:55 | 3
1 | 2019-04-25 15:10:55 | 23
2 | 2019-04-25 15:10:55 | 29
Как мне при запросе объединить эти две таблицы и сделать выборку в таком формате
|id|user|последний count за сегодня|последний count за вчера|
если mysql 8, то можно так, например
select id, user , sum(last_cnt_today), sum(last_cnt_yestoday)
from (
select distinct user_id
, date(data_time)
,case
when date(data_time)=CURDATE() then
LAST_VALUE(count) OVER(PARTITION BY user_id, date(data_time) order by user_id, data_time
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
else 0
end as last_cnt_today
,case
when date(data_time)=( CURDATE() - INTERVAL 1 DAY ) then
LAST_VALUE(count) OVER(PARTITION BY user_id, date(data_time) order by user_id, data_time
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
else 0
end as last_cnt_yestoday
from data d
where data_time >= ( CURDATE() - INTERVAL 1 DAY )
) q
, user u
where q.user_id=u.id
group by id, user;
а если более ранний, то можно так
select id, user, sum(last_count_today), sum(last_count_yestoday )
from (
select id, user
, case
when date(dt)=CURDATE() then
(select count from data where data_time=max_dt.dt and user_id=u.id)
else 0
end as last_count_today
, case
when date(dt)=(CURDATE() - INTERVAL 1 DAY) then
(select count from data where data_time=max_dt.dt and user_id=u.id)
else 0
end as last_count_yestoday
from user u,
(select user_id, max(data_time) as dt from data
where data_time >= ( CURDATE() - INTERVAL 1 DAY )
group by user_id, date(data_time)) max_dt
where max_dt.user_id=u.id) q
group by id, user
В моем примере, таблица temp_user
соответствует вашей user
, аналогично и с таблицей count
. Данные в таблицах указаны на основании вашего примера и на выходе я имею результат который пытался добиться от вас в комментарии (как и описание задачи с явным указанием того что есть, и что должно быть на выходе).
Вкратце, берем за основу таблицу с пользователями (ведь каждый уникален) далее подгружаем таблицу с "событиями" count
привязывая её по user_id
фильтруем по нужной дате, сортируем, чтобы получить последний "каунт", дальше подгружаем и сортируем аналогично вторую копию таблицы count
. Ну и в конце (к сожалению не знаю как сделать иначе) в строке LIMIT 2
нужно указать зная заранее сколько у нас пользователей в таблице user
SELECT
`today`.`id`,
`today`.`user_id`,
`today`.`count` AS `today_count`,
`yesterday`.`count` AS `yesterday_count`
FROM
`temp_user`
JOIN `temp_count` AS `today`
ON
`today`.`user_id` = `temp_user`.`id`
JOIN `temp_count` AS `yesterday`
ON
`yesterday`.`user_id` = `temp_user`.`id`
WHERE
`today`.`data_time` > '2019-04-26 00:00:00' AND `today`.`data_time` < '2019-04-26 23:59:59' AND `yesterday`.`data_time` > '2019-04-25 00:00:00' AND `yesterday`.`data_time` < '2019-04-25 23:59:59'
ORDER BY
`today`.`data_time`
DESC
,
`yesterday`.`data_time`
DESC
LIMIT 2
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Не могу понять, как работает соединение с БД в DoctrineИспользую Symfony 4, запущен встроенный php-сервер
Мне нужно разработать систему интеграции с различными информационными системами