Първо създайте сумата, след това се присъединете. Като това:
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
) в подизбор и след това обобщете.