【发布时间】:2014-03-18 13:01:36
【问题描述】:
在我的数据库中,我有一个表 payers_payments,由一些外键(payer_id、payment_id)和一些数据透视字段(amount、pays)组成。
| id | payer_id | payment_id | amount | pays |
|----|----------|------------|--------|------|
| 1 | 1 | 1 | 20 | 0 |
| 2 | 2 | 1 | 23 | 1 |
| 4 | 1 | 2 | 14 | 1 |
| 5 | 2 | 2 | 17 | 1 |
| 6 | 1 | 3 | 10 | 1 |
| 7 | 2 | 3 | 0 | 0 |
每一行代表payer 对payment 所做的贡献。 pays 字段指定是否应将 payer 包含在付款中。
payment 的总成本是给定payment_id 的amount 的总和。因此,如果我想看看我会运行多少付款 2:
SELECT SUM(amount) AS sumOfPayment
FROM payers_payments
WHERE payment_id=2;
同样,给定的payer(例如付款人 1)贡献的总金额为:
SELECT SUM(amount) AS sumOfPayment
FROM payers_payments
WHERE payer_id=1;
现在,我想做的是使用公平分享的概念。公平份额是付款的总成本除以拥有pay=1 的payers 的数量。我可以表达这一点的最简单方法是使用子查询:
SELECT SUM(payers_payments.amount) / (SELECT count(*)
FROM payers_payments
WHERE pays
AND payers_payments.payment_id = 3
) AS FairShare
FROM payers_payments
WHERE payment_id=3
GROUP BY
payers_payments.payment_id;
对于给定的payer 和payment,它们的公平份额定义为:
SELECT IF(pays, FairShare, 0) as payerFairShare
FROM payers_payments
WHERE payer_id = 1
AND payment_id=3; --FairShare is the query as above
我的问题是,我希望根据每笔付款的公平份额以及它们是否包含在付款中,查询每个 payer 的总公平份额。 (如果pays=false 那么他们的公平份额是0)
根据上述数据,这是我为 2 个付款人所追求的结果:
| payer_id | total_paid | fair_share |
|----------|------------|------------|
| 1 | 44 | 25.5 |
| 2 | 40 | 58.5 |
有没有办法在单个查询中实现这一点,还是我必须对结果集进行一些循环? 我对 RDMS 不了解,但类似 MySQL 的东西很好。
【问题讨论】:
-
应该可以使用子查询。