MySQL查询,其中包含对数据库中特定用户的连接+计数

时间:2019-04-12 15:06:44

标签: mysql sql database join count

我想使用查询从多个表中获取多个实体的总和。 具体来说,我希望用户的设备和消息数。此外,该用户最后收到的消息的时间戳。 我有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 个答案:

答案 0 :(得分:1)

加入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 :(得分:1)

最简单的方法是在子查询中获取每个设备的消息数和最新消息时间。

val mockHome = mockk<Home>() {
    every { name } answers { "My Home" }
}

答案 2 :(得分:0)

您可以尝试在用户和设备之间使用联接,并使用带有消息和设备子查询的内部联接

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