2

いくつかの結合といくつかの計算を行うテーブルから単純な SUM と COUNT を取得しようとしています。私はそれを正しく理解できません。

私は4つのテーブルを持っています:

USERS
user_id, name
1, user1
2, user2
3, user3
4, user4

RESULTS
user_id, plus, minus
1, 1, 0
1, 1, 0
1, 1, 0
3, 0, 1
3, 1, 0
3, 1, 0
3, 1, 0

NOTES
user_id, note
1, lorem ipsum
3, abc
1, qwerty
3, qwerty

MESSAGES
user_id, message
1, lorem ipsum
3, abc
1, qwerty
3, qwerty
3, qwerty
3, qwerty
3, qwerty

マイナスからプラスを引いた結果、メモの量、ユーザーのメッセージの量をすべて合計したいと思います。

私のクエリ:

SELECT u.`user_id`, SUM(w.`plus`-w.`minus`), COUNT(g.`user_id`), COUNT(m.`user_id`)
FROM `users` u
LEFT JOIN `results` w ON u.`user_id` = w.`user_id` 
LEFT JOIN `notes` g ON u.`user_id` = g.`user_id` 
LEFT JOIN `messages` m ON u.`user_id` = m.`user_id` 
GROUP BY 1

期待される結果は次のようになります。

user_id: sum(plus-minus) amount of notes, amount of messages
1: 3, 2, 2
3: 2, 2, 5

残念ながら、クエリは次を返します。

user_id: sum(plus-minus) amount of notes, amount of messages
1: 12, 12, 12
3: 20, 40, 40

どんな助けでも大歓迎です。

4

1 に答える 1

1

user_id正しい値が得られるように、サブクエリ内のレコードを手動でカウントする必要があります。

SELECT  u.user_ID, u.Name,
        COALESCE(r.totalResult, 0) totalResult,
        COALESCE(n.totalNotes, 0) totalNotes,
        COALESCE(m.totalMessages, 0) totalMessages
FROM    users u 
        LEFT JOIN
        (
            SELECT  user_ID, SUM(plus - minus) totalResult
            FROM    Results
            GROUP   BY user_ID
        ) r ON  u.user_ID = r.user_ID
        LEFT JOIN
        (
            SELECT  user_ID, COUNT(*) totalNotes
            FROM    Notes
            GROUP   BY user_ID
        ) n ON u.user_ID = n.user_ID
        LEFT JOIN
        (
            SELECT  user_ID, COUNT(*) totalMessages
            FROM    Messages
            GROUP   BY user_ID
        ) m ON u.user_ID = m.user_ID

ただしauto_incremented、すべてのテーブルに列を設定した場合は、サブクエリから明確に数えることができるため、サブクエリは必要ありません。

于 2013-09-13T11:49:38.667 に答える