Първо създайте сумата, след това се присъединете. Като това:
SELECT i.uid
,i.date
,i.v_in
,COALESCE(o.v_out, 0) AS v_out
,(i.v_in - COALESCE(o.v_out, 0)) AS balance
FROM (
SELECT date
,uid
,SUM(value_in) AS v_in
FROM table1
GROUP BY 1,2
) i
LEFT JOIN (
SELECT date
,uid
,SUM(value_out) AS v_out
FROM table2
GROUP BY 1,2
) o USING (date, uid)
По начина, по който го имахте, всеки value_in ще се комбинира с всеки съвпадащ value_out , като по този начин се умножават числата. Първо трябва да обобщите и след това да се присъедините към едно в сум седната out-sum и всичко е супер. Или е така?
Какво се случва, ако няма value_in или value_out за даден (date, uid) ? Или само value_in Или просто value_out ? Заявката ви ще бъде неуспешна.
Подобрих, като използвах LEFT JOIN вместо [INNER] JOIN , но това, което наистина искате, е FULL OUTER JOIN - една от липсващите функции в MySQL.
Можете или да предоставите списък с дни в отделна таблица и LEFT JOIN и двете таблици към него или можете да заобиколите липсващата функция с два пъти LEFT JOIN и UNION . Вижте тук за пример
.
Или можете да умножите своя value_out от -1 СЪЕДИНЯВАЙТЕ двете маси заедно и съставете една сума.
Но тивсе още няма да получи ред за един ден без value_in или value_out , което нарушава описанието ви.
И така,единственото чисто решение е да имате таблица с всички (date, uid) искате в резултата и LEFT JOIN сумите на table1 и table2 към него или UNION ALL трите (отрицателен table2 ) в подизбор и след това обобщете.