mysql объединение двух таблиц

127
16 ноября 2020, 13:50

есть две таблицы 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 за вчера|
Answer 1

если 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
Answer 2

В моем примере, таблица 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

READ ALSO
Doctrine - постоянное соединение с базой данных PostgeSQL

Doctrine - постоянное соединение с базой данных PostgeSQL

Не могу понять, как работает соединение с БД в DoctrineИспользую Symfony 4, запущен встроенный php-сервер

125
Сортировка элементов массива

Сортировка элементов массива

Имеется многомерный массив, выглядит он следующим образом:

116
Уровни исключений и логирование

Уровни исключений и логирование

Мне нужно разработать систему интеграции с различными информационными системами

134