根据列值仅为MySQL选择一次记录

根据列值仅为MySQL选择一次记录,sql,mysql,Sql,Mysql,我有一个存储交易信息的表。每笔交易都有一个唯一的(自动递增的)id列,一个包含客户id号的列,一个名为bill\u paid的列,该列指示客户是否已使用“是”或“否”为交易付款,以及一些其他列,其中包含与我的问题无关的其他信息 我想从交易表中选择所有未支付账单的客户ID,但如果客户有多个未支付账单的交易,我不想多次选择。通过这种方式,我可以为客户生成一张账单,其中包含他们所欠的所有交易,而不是为每笔交易生成一张单独的账单。我如何构建一个能为我做到这一点的查询?您可以尝试使用操作符,例如按客户分组

我有一个存储交易信息的表。每笔交易都有一个唯一的(自动递增的)id列,一个包含客户id号的列,一个名为
bill\u paid
的列,该列指示客户是否已使用“是”或“否”为交易付款,以及一些其他列,其中包含与我的问题无关的其他信息


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

您可以尝试使用操作符,例如按客户分组。

对于每个
账单支付
等于“否”的客户,只返回一个
客户id

SELECT customer, SUM(toPay) FROM .. GROUP BY customer
SELECT 
    t.customer_id
FROM 
    transactions t
WHERE 
    t.bill_paid = 'no'
GROUP BY
    t.customer_id
编辑:
分组依据
总结您的结果集。
注意:所选的每一列都必须“按分组”或以某种方式聚合。如图所示,您可以使用
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
。这里不需要别名,因为您只查询一个表,但我发现它们对于更大的查询非常有用。您可以选择键入
作为
,以更清楚地表明您使用的是别名。

这如何排除bill_paid=yes列?感谢您的回答,但正如@Konerak指出的,这并没有考虑到
bill_paid
的状态。既然我不是MySQL忍者,请您为我详细解释一下。具体来说,
t.
代表什么?还有,
transactions t
在做什么?谢谢,我现在把它们都放在一起了,看起来它会起作用。让我问你一个问题,是否不赞成使用PHP来计算我的总数,而不是使用MySQL
SUM()
函数?我想坚持“最佳实践”,但我认为使用PHP进行计算会更容易,因为我生成的账单是逐项列出的。简单的汇总,如上面的示例,在MySQL中处理起来更简单(而且可能更快)。感谢您的回答,
group by
是我想要的,但是@Adam Bernier解释得更透彻了。