2010-07-24 104 views
1

我有一个存储事务信息的表。每笔交易都有一个唯一的(自动递增的)ID列,一列包含客户的身份证号码,一列名为bill_paid,表明该交易是否由客户支付了是或否,以及其他一些列其他信息与我的问题无关。根据列值仅为MySQL选择记录一次

我想从交易表中选择所有尚未支付帐单的客户ID,但如果客户有多笔交易未支付帐单,我不想多次选择它们。通过这种方式,我可以为客户生成一份账单,并为其每笔交易的所有交易而不是单独的账单。我将如何构建一个为我做到的查询?

回答

3

返回每个客户提供bill_paid等于 '不',只有一个customer_id

SELECT 
    t.customer_id 
FROM 
    transactions t 
WHERE 
    t.bill_paid = 'no' 
GROUP BY 
    t.customer_id 

编辑:
GROUP BY总结你的结果集。
警告:所选的每列必须按'分组'或以某种方式汇总。如图nikic你可以使用SUM拿到欠款总金额,例如:

SELECT 
    t.customer_id 
    , SUM(t.amount) AS TOTAL_OWED 
FROM 
    transactions AS t 
WHERE 
    t.bill_paid = 'no' 
GROUP BY 
    t.customer_id 

t是一个单纯的别名。
因此,不要在任何地方输入交易,现在只需键入t即可。别名在这里没有必要,因为你只查询一个表,但我发现它们对于较大的查询是非常有用的。您可以选择键入AS以更清楚地表明您正在使用别名。

+0

由于我不是MySQL忍者,你会为我分解这一点。具体来说,'t.'代表什么?另外,什么是“交易t”呢? – ubiquibacon 2010-07-24 22:25:00

+0

@typoknig:当然。请参阅编辑。 – bernie 2010-07-24 22:35:04

+0

谢谢,我现在把它放在一起,看起来它会工作。让我问你这个问题,是否使用PHP来计算我的总数而不是MySQL的SUM()函数?我想坚持“最佳实践”,但我认为使用PHP进行计算会更容易,因为我生成的账单是逐项的。 – ubiquibacon 2010-07-25 00:00:18

0

您可以尝试Group By运营商,例如由客户进行分组。

+1

感谢您的回答,“group by”是我一直在寻找的东西,但是@Adam Bernier更加彻底地解释了它。 – ubiquibacon 2010-07-25 00:22:22

0
SELECT customer, SUM(toPay) FROM .. GROUP BY customer 
+0

这是如何排除bill_paid = yes列的? – Konerak 2010-07-24 22:22:14

+0

感谢您的回答,但是@Konerak指出,这不考虑'bill_paid'的状态。 – ubiquibacon 2010-07-25 00:23:15