2010-07-24 103 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

相關問題