Необходимо было чтобы в правой таблице, которая райтджойнится, были ВСЕ значения по которым вы хотите получить данные и которые группируются, т.е. в ней должны быть
все user_id и
все возможные (нужные для выборки)
mode
для этого делается что?
делается декартово произведение (cross join), чтобы получить такую "матрицу"
SELECT * FROM
(SELECT user_id FROM tbl GROUP BY user_id) u,
(SELECT 1 as mode UNION SELECT 2) m
;
райтджойнится должен такой запрос!
и группировка должна делаться по полям этого запроса (т.к. в исходной таблице может не быть значений)!
в итого запрос будет такой:
SELECT t2.user_id, t2.mode, SUM(COALESCE(f1,0)) as f1, SUM(COALESCE(f2,0)) as f2
FROM tbl t1
RIGHT JOIN (
SELECT * FROM
(SELECT user_id FROM tbl GROUP BY user_id) u,
(SELECT 1 as mode UNION SELECT 2) m
) t2 ON t2.user_id = t1.user_id AND t2.mode = t1.mode
GROUP BY t2.user_id, t2.mode
ORDER BY t2.user_id, t2.mode
;
работающий пример на
sqlfiddle
как-то так.
UPD
PS:
скорее всего имеется некая таблица users, тогда в кроссджойн не надо использовать саму же таблицу
(SELECT user_id FROM tbl GROUP BY user_id) u1
, а к таблице user закроссить
(SELECT 1 as mode UNION SELECT 2) m
и залефтджойнить подопытную таблицу.
получим как-то так:
SELECT u.user_id, u.name, m.mode, SUM(COALESCE(f1,0)) as f1, SUM(COALESCE(f2,0)) as f2
FROM
users u
CROSS JOIN (SELECT 1 as mode UNION SELECT 2) m
LEFT JOIN tbl t ON u.user_id = t.user_id AND m.mode = t.mode
GROUP BY u.user_id, u.name, m.mode
;
кроме того, в таком случае можно выводить имена пользователей, так же для пользователей по которым вообще нет записей в исследуемой таблице, будут выводится 0
см. пример на
sqlfiddle