所以我有用户,电话,短信表,现在我想得到每个用户的传入和传出呼叫和短信的数量
我有这个查询
select u.username,
sum(case when c.type = 'incoming' then 1 else 0 end) as incoming,
sum(case when c.type = 'incoming' and status = 'true' then 1 else 0 end) as answered,
sum(case when c.type = 'outgoing' then 1 else 0 end) as outgoing,
sum(case when s.type = 'in' then 1 else 0 end ) as sms
from user u
join
calls c
on u.id = c.user_id
join
sms s
on u.id = s.user_id
group by u.username;
结果就是这个
调用中的传入和传出是正确的但是在短信中,用户样本中的结果是错误的,它应该是列sms中的1而不是4
答案 0 :(得分:1)
为了避免您对连接产生的乘法效应,您可以尝试按用户单独聚合调用和短信表,然后加入这些子查询:
SELECT
u.username,
COALESCE(t1.incoming, 0) AS incoming,
COALESCE(t1.answered, 0) AS answered,
COALESCE(t1.outgoing, 0) AS outgoing,
COALESCE(t2.sms, 0) AS sms
FROM user u
LEFT JOIN
(
SELECT
user_id,
SUM(CASE WHEN type = 'incoming' THEN 1 ELSE 0 END) AS incoming,
SUM(CASE WHEN c.type = 'incoming' AND status = 'true'
THEN 1 ELSE 0 END) AS answered,
SUM(CASE WHEN c.type = 'outgoing' THEN 1 ELSE 0 END) AS outgoing
FROM calls
GROUP BY user_id
) t1
ON u.id = t1.user_id
LEFT JOIN
(
SELECT
user_id,
SUM(CASE WHEN s.type = 'in' THEN 1 ELSE 0 END) AS sms
FROM sms
GROUP BY user_id
) t2
ON u.id = t2.user_id