我正在尝试为PHP页面构建一个mySQL数据库,该数据库将允许用户输入账单的成本并选择与之分家的人。我遇到的问题是,我无法弄清楚如何计算居民之间的欠款,并考虑到他们已经支付的费用以及他们需要付给别人的费用。

我希望它能够处理可变数量的用户“居民”,因此将表设计如下:

用户表:

 UserID | User
 -------+---------
 1      | Jon
 2      | Boris
 3      | Natalie


票据表:

 BillID |  BIll  |  Amount  |  Paid By (UserID F.Key)
 -------+--------+----------+--------------
 1      | Gas    | £30.00   |  1 (Jon)
 2      | Water  | £30.00   |  1 (Jon)
 3      | Tax    | £60.00   |  2 (Boris)
 4      | Phone  | £10.00   |  2 (Boris)


因此,该表显示“电话费”为10英镑,鲍里斯为此向电话公司付款。

帐单用户负债连接表:

 UserID_fKey | BillID_fKey
 ------------+--------------
 1 (Jon)     | 1 (Gas)
 2 (Boris)   | 1 (Gas)
 3 (Nat)     | 1 (Gas)
 1 (Jon)     | 2 (Water)
 2 (Boris)   | 2 (Water)
 3 (Nat)     | 2 (Water)
 1 (Jon)     | 3 (Tax)
 2 (Boris)   | 3 (Tax)
 1 (Jon)     | 4 (Phone)
 2 (Boris)   | 4 (Phone)


“帐单用户”表用于描述谁应对每张帐单负责。因此,例如娜塔莉(Natalie)从未使用过手机,因此不需要为鲍里斯(Boris)付任何钱。因此,电话费在Borris和Jon之间分配。乔恩因此欠鲍里斯5英镑。

我认为这是最好的方法,但是我无法弄清楚如何在每个用户登录时为每个用户生成一个表,以显示彼此的欠款。为此(例如),我需要将Jon支付的所有费用,每个人代表Jon支付的费用相加并计算出余额。显然,这需要扩展,以便系统中可以有3个或更多用户。

这是我想要得到的结果:

(例如:以Jon身份登录)

 User    | Amount Owed
---------+-------------
 Boris   | -£15.00
 Natalie |  £20.00


提前谢谢了。

最佳答案

您需要在帐单表中添加一个owe字段以做最底层的操作。

选择个人用户

SELECT Users.User, Bills.BIll, Bills.owe, Bills.Amount
FROM Users
LEFT JOIN Bills ON Users.UserID = Bills.UserID
WHERE Users.UserID =1


选择所有用户

SELECT Users.User, Bills.BIll, Bills.owe, Bills.Amount
FROM Users
LEFT JOIN Bills ON Users.UserID = Bills.UserID
LIMIT 0 , 30


选择所有用户的总和

SELECT Users.User, Bills.BIll, sum(Bills.owe), sum(Bills.Amount), sum(Bills.owe)- sum(Bills.Amount) as arrears
FROM Users
LEFT JOIN Bills ON Users.UserID = Bills.UserID
GROUP BY Users.UserID;


demo

10-08 00:06