我正在尝试为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.00英镑而鲍里斯为电话公司支付了费用。
票据 - 用户责任联结表:
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)
Bill-Users表用于描述谁对每个账单负责。因此,例如Natalie从不使用手机,因此不需要为Boris支付任何费用。因此,电话费在Borris和Jon之间分配。乔恩因此欠鲍里斯5英镑。
我认为这是最好的方法,但我无法弄清楚如何为每个用户生成一个表,当他们登录时显示他们彼此欠的东西。要做到这一点(例如)我需要将Jon付出的所有内容,每个人代表Jon付出的代价加起来,并计算出余额。显然,这需要扩展,以便系统中可以有3个或更多用户。
这是我想要的结果:
(例如:以Jon身份登录)
User | Amount Owed
---------+-------------
Boris | -£15.00
Natalie | £20.00
非常感谢提前。
答案 0 :(得分:0)
你需要在账单表中找一个欠款字段才能做到最后一点。
选择个人用户
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;
答案 1 :(得分:0)
最后,我通过使用一个函数实现了这一点。它可能不会很好地扩展到100个用户,但仍然给了我想要的灵活性。我正在尝试启动一个SQLFiddle来演示它但有问题。
Set @CurrentUser = '1' (Jon)
Select User, funcAmountOwed(@currentuser,UserID) from Users
WHERE UserID != @CurrentUser;
返回:
User | Amount Owed
---------+-------------
Boris | -£15.00
Natalie | £20.00
该功能类似于:
funcAmountOwed(@CurrentUser, @CurrentDebtor);
SET @AmountPaidByCurrentUser = (
Select SUM(Amount) from Bills b
INNER JOIN BillsUsers bu ON b.BillID = bu.BillID_fkey
WHERE b.PaidBy = @CurrentUser and bu.UserId_fkey = @CurrentDebtor)
SET @AmountPaidByDebtor = (
Select SUM(Amount) from Bills b
INNER JOIN BillsUsers bu ON b.BillID = bu.BillID_fkey
WHERE b.PaidBy = @CurrentDebtor and bu.UserId_fkey = @CurrentUser)
RETURN @AmountPaidByCurrentUser - @AmountPaidByDebtor;
我必须在那里嵌套另一个函数来将Amount除以Bill之间分配的人数,但是如上所述我不记得没有SQLFiddle的内存。