3

我有一个 MySQL 表设置如下:

debts

--------------------------
owed_by | owed_to | amount
--------|---------|-------
Alice   | Bob     | 5
Bob     | Jane    | 10
Alice   | Jane    | 10
Jane    | Bob     | 5

是否可以在 MySQL 中编写一个查询来返回每个人所欠的总额?他们欠谁并不重要,我只想归还每个人和(欠的人总数 - 欠的人总数)

获得总欠款很容易

SELECT `owed_by`, SUM(`amount`) as 'Total Debt'
FROM `debts`
GROUP BY `owed_by`
ORDER BY SUM(`amount`) DESC

但我不知道如何减去他们的欠款。

此外,作为一般规则,在 MySQL(如果可能)或 PHP 中执行这样的操作更好吗?

这是我的示例数据的 SQL Fiddle:http ://sqlfiddle.com/#!2/dd7cf/1

4

4 回答 4

3

您可以结合双方:

select Person, sum(debt) as 'Total Debt'
from (
    select owed_by as 'Person', amount as 'debt'
    from debts
    union all
    select owed_to, -1*amount
    from debts
) as q
group by Person;
于 2012-09-25T13:43:40.133 回答
2
SELECT owed.owed_by, owed.amount - coalesce(owns.amount, 0) as `Total Debt`
FROM (
        select owed_by, sum(amount) as amount
        from debts
        group by owed_by
    ) owed
    left join (
        select owed_to, sum(amount) as amount
        from debts
        group by owed_to
    ) owns on owed.owed_by = owns.owed_to
ORDER BY `Total Debt` DESC
于 2012-09-25T13:48:04.533 回答
1
SELECT od.person, od.amount - COALESCE(ow.amount, 0) AS balance  
FROM (SELECT owed_to AS person, SUM(amount) AS amount FROM debts GROUP BY owed_to) od  
LEFT OUTER JOIN (SELECT owed_by AS person, SUM(amount) AS amount FROM debts GROUP BY owed_by) ow  
ON od.person = ow.person
UNION  
SELECT owed_by, SUM(amount) * (-1) FROM debts   
WHERE owed_by NOT IN (SELECT DISTINCT owed_to FROM debts)   
GROUP BY owed_by; 
于 2012-09-25T13:58:37.840 回答
0
SELECT `owed_by`, SUM(`amount`) as 'Total Debt'.
(select sum(amount) from debts d2 where d1.owed_by = d2.owed_to) as `Total Plus`
FROM `debts` d1
GROUP BY `owed_by`
ORDER BY SUM(`amount`) DESC
于 2012-09-25T13:29:02.100 回答