I have the following tables:
svc_sms:
sms_pk | sms_title
AND
svc_sms_msg:
msg_pk | sms_text | msg_status | sms_pk (FK to svc_sms.sms_pk)
I want to query and group all rows from svc_sms_msg by msg_status, so I do:
SELECT sms.sms_pk, msg.msg_status, COUNT(msg.msg_status) as num
FROM svc_sms_msg as msg
INNER JOIN svc_sms as sms ON sms.sms_pk = msg.sms_pk
GROUP BY sms.sms_pk, msg.msg_status
ORDER BY sms.sms_pk, msg.msg_status
Now supose that msg.msg_status ranges ONLY between 0 and 4, so I need to get the number of times each sms with sms_status = 'x' appears in the grouping by sms_pk. I need my results to be something like this:
> sms.sms_pk | msg.msg_status | num
>
> 1 0 1
>
> 1 1 5
>
> 1 2 4
>
> 1 3 20
>
> 1 4 18
>
> 2 0 5
>
> 2 1 0
>
> 2 2 3
>
> 2 3 23
>
> 2 4 0
But when there are not rows (in msg) with 'msg_status = x', the join gives me nothing, and I need to show the ammount of "statuses" even when they are 0's Before I was doing like this:
(SELECT SUM(CASE WHEN (msg_status = 0) THEN 1 ELSE 0 END) FROM svc_sms_msg WHERE sms_pk = svc_sms.sms_pk) as cnt_initial");
(SELECT SUM(CASE WHEN (msg_status = 1) THEN 1 ELSE 0 END) FROM svc_sms_msg WHERE sms_pk = svc_sms.sms_pk) as cnt_pending");
(SELECT SUM(CASE WHEN (msg_status = 2) THEN 1 ELSE 0 END) FROM svc_sms_msg WHERE sms_pk = svc_sms.sms_pk) as cnt_sended");
etc....but it proved to be too slow and unpractical in my case. How can I do this in a more eficient way? Thank you