我有一個存儲事務信息的表。每筆交易都有一個唯一的(自動遞增的)ID列,一列包含客戶的身份證號碼,一列名爲bill_paid
,表明該交易是否由客戶支付了是或否,以及其他一些列其他信息與我的問題無關。根據列值僅爲MySQL選擇記錄一次
我想從交易表中選擇所有尚未支付帳單的客戶ID,但如果客戶有多筆交易未支付帳單,我不想多次選擇它們。通過這種方式,我可以爲客戶生成一份賬單,併爲其每筆交易的所有交易而不是單獨的賬單。我將如何構建一個爲我做到的查詢?
我有一個存儲事務信息的表。每筆交易都有一個唯一的(自動遞增的)ID列,一列包含客戶的身份證號碼,一列名爲bill_paid
,表明該交易是否由客戶支付了是或否,以及其他一些列其他信息與我的問題無關。根據列值僅爲MySQL選擇記錄一次
我想從交易表中選擇所有尚未支付帳單的客戶ID,但如果客戶有多筆交易未支付帳單,我不想多次選擇它們。通過這種方式,我可以爲客戶生成一份賬單,併爲其每筆交易的所有交易而不是單獨的賬單。我將如何構建一個爲我做到的查詢?
返回每個客戶提供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
以更清楚地表明您正在使用別名。
您可以嘗試Group By運營商,例如由客戶進行分組。
感謝您的回答,「group by」是我一直在尋找的東西,但是@Adam Bernier更加徹底地解釋了它。 – ubiquibacon 2010-07-25 00:22:22
SELECT customer, SUM(toPay) FROM .. GROUP BY customer
這是如何排除bill_paid = yes列的? – Konerak 2010-07-24 22:22:14
感謝您的回答,但是@Konerak指出,這不考慮'bill_paid'的狀態。 – ubiquibacon 2010-07-25 00:23:15
由於我不是MySQL忍者,你會爲我分解這一點。具體來說,'t.'代表什麼?另外,什麼是「交易t」呢? – ubiquibacon 2010-07-24 22:25:00
@typoknig:當然。請參閱編輯。 – bernie 2010-07-24 22:35:04
謝謝,我現在把它放在一起,看起來它會工作。讓我問你這個問題,是否使用PHP來計算我的總數而不是MySQL的SUM()函數?我想堅持「最佳實踐」,但我認爲使用PHP進行計算會更容易,因爲我生成的賬單是逐項的。 – ubiquibacon 2010-07-25 00:00:18