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