MySQL запрос с join + count для конкретного пользователя в БД - PullRequest
0 голосов
/ 12 апреля 2019

Я хочу получить сумму нескольких сущностей из нескольких таблиц, используя запрос. В частности, я хочу количество устройств и сообщений пользователя. Кроме того, отметка времени последнего полученного сообщения для этого пользователя. У меня есть 3 таблицы:

Пользователи

id     name     (other fields)
1      Mike     ...
2      John     ...
3      Yay      ...
4      Jim      ...

Устройства

id     user_id   (other fields)
1      1         ...
2      1         ...
3      1         ...
4      2         ...

Сообщения

id     device_id   message    time                   (other fields)
1      1           Hi         2019-04-07 12:06:44    ...
2      1           Hey        2019-04-06 12:06:44    ...
3      2           Sup        2019-04-05 12:06:44    ...
4      3           Ok         2019-04-04 12:06:44    ...
5      4           Yay        2019-04-08 12:06:44    ...

... и, например, для пользователя Mike Я хочу получить:

Результат

nDevices    nMessages      time 
3           4              2019-04-07 12:06:44

Есть идеи? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 12 апреля 2019

Присоединитесь к 3 таблицам и посчитайте различные значения столбцов:

select 
  count(distinct d.id) devicescounter, 
  count(distinct m.id) messagescounter,
  max(m.time) lastmessagetime
from users u
left join devices d on u.id = d.user_id 
left join nessages m on m.device_id = d.id
where u.name = 'Mike' 

Если вы хотите, чтобы результаты для всех пользователей:

select 
  u.id, u.name, 
  count(distinct d.id) devicescounter, 
  count(distinct m.id) messagescounter,
  max(m.time) lastmessagetime
from users u
left join devices d on u.id = d.user_id 
left join nessages m on m.device_id = d.id
group by u.id, u.name
1 голос
/ 12 апреля 2019

Самый простой способ сделать это - получить количество сообщений и время последнего сообщения для каждого устройства в подзапросе.

  SELECT u.id,
         COUNT(d.id) AS num_devices,
         SUM(messages) AS num_messages,
         MAX(most_recent) AS most_recent_message
    FROM users u
    JOIN devices d ON d.user_id = u.id
    JOIN (SELECT device_id,
                 COUNT() AS messages,
                 MAX(TIME) AS most_recent_message
            FROM messages
        GROUP BY device_id) m ON m.device_id = d.id
GROUP BY u.id
0 голосов
/ 12 апреля 2019

Можно попробовать использовать соединение между пользователем и устройством и внутреннее объединение с подзапросом для сообщения и устройства

select a.name, a.id,  count(d.user_id), t.nDevice, t.max_time 
from Users a 
inner join  device d on a.id = d.user_id 
inner join  (
  select m.device_id, count(m.device_id) nDevice, max(m.time) max_time
  from Messages  m
  group by m.device_id
) t on t.device_id = d.id 
group by a.name, a.id 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...