2017-05-31 19 views
0

これが可能かどうかわかりません。私は1つのテーブルmembersと2番目のテーブルtransactionsを持っています。1つのテーブルからデータを取得し、別のテーブルからデータを取得する

membersテーブルからメンバーの名前を取得する必要がありますが、メンバーが別のテーブルから行ったトランザクションの数もカウントする必要があります。これはJOIN文でも可能ですか、2つの文を書く必要がありますか?

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テーブルを読み込んだ後に気付かれなかった"と言います。

これは可能ですか?もしそうなら、私は間違って何をしていますか?前もって感謝します。

EDIT: サンプルデータ構造と予想される出力:

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'と同じ値として間違って数えます。 't.getter_id'列と' t.giver_id'列の両方でカウントできるように 'ON'文を修正する必要がありますか? – freeworlder

+0

質問を修正し、データサンプルに予想される出力を提供できますか? –

+0

サンプルデータと期待される出力が追加されました。 – freeworlder

関連する問題