2017-05-31 133 views
0

我不確定這是否可能。我有一個表members和第二個表transactions從一個表中獲取數據並從另一個表中匹配記錄數

我需要從members表中獲取成員的名稱,還要計算成員從另一個表中創建的事務數。這甚至可能在JOIN語句中,還是我需要寫兩條語句?

SELECT 
    m.first_name, 
    m.last_name, 
    COUNT(t.giver_id), 
    COUNT(t.getter_id) 
FROM 
    members AS m 
JOIN 
    transactions AS t 
ON 
    m.id = t.giver_id 
WHERE 
    m.id = $i 

我要補充,這是可能的成員並沒有作出任何交易,因此不會出現在transactions表。

當我運行此代碼時,它將返回所有NULL列。當我添加EXPLAIN聲明時,MySql說「讀取const表後不可能注意到......」

這可能嗎?如果是這樣,那麼我做錯了什麼?提前致謝。

編輯: 樣本數據結構和預期產出:

members 
id | first_name | last_name 
_______________________________ 
1 |  Bill  | Smith 
2 |  Joe  | Jones 

transactions table 
id | giver_id | getter_id | status 
________________________________________ 
1 |  1  |  2  | complete 
2 |  1  |  2  | complete 

所以運行我的查詢應該返回:

1 | Bill | Smith | 2 | 0 
2 | Joe | Jones | 0 | 2 

回答

1

簡單LEFT JOIN就足夠了:

SELECT 
    m.first_name, 
    m.last_name, 
    SUM(CASE WHEN m.id = t.giver_id THEN 1 END) AS giver_count, 
    SUM(CASE WHEN m.id = t.getter_id THEN 1 END) AS getter_count 
FROM members AS m 
LEFT JOIN transactions AS t ON m.id = t.giver_id OR m.id = t.getter_id 
GROUP BY m.first_name, m.last_name 

不要在使用聚合函數時忘記添加GROUP BY。僅僅因爲MySQL允許查詢在沒有它的情況下通過,並不意味着它被建議。 MySQL將爲未集合的列挑選隨機的行值,這可能會造成問題。避免這種反模式。

+0

謝謝。我剛剛嘗試過,但它錯誤地將't.getter_id'計數爲與't.giver_id'相同的值。我是否需要修改'ON'語句以允許在't.getter_id'和't.giver_id'列上進行計數? – freeworlder

+0

你可以修改你的問題並提供預期輸出的數據樣本嗎? –

+0

已添加樣本數據和預期輸出。 – freeworlder

相關問題