0

2 つのテーブルがあるとします。

メンバー

------------------------
| user_id | first_name |
------------------------

メッセージ

--------------------------------------------------
| sender_id | recipient_id | message_type | body |
--------------------------------------------------

次を返すクエリを作成したいと思います。

---------------------------------------------
| user_id | first_name | number_of_messages |
---------------------------------------------

特定のnumber_of_messagesタイプのメッセージのみをカウントする必要がありmessage_type = 0ますが、そのタイプのメッセージを送信しなかったメンバーを結果セットに含めたいと考えています。

これは私が現在持っているものです:

SELECT [user_id], [first_name], COUNT(sender_id) as number_of_messages
FROM [Member]
    FULL OUTER JOIN [Message] ON user_id = sender_id
where message_type = 0
GROUP BY [Member].[user_id], [first_name]
ORDER BY number_of_messages DESC

このクエリの問題は、タイプ 0 のメッセージを送信していないメンバーが結果セットに含まれないことです。したがって、message_type = 0句を使用して を減らしたいのnumber_of_messagesですが、返される結果の数に影響を与えたくありません。

表示されているクエリに対して実行できる他の最適化がある場合は、お気軽にコメントしてください。

4

2 に答える 2

2

OUTER JOIN を使用します。

   SELECT [user_id], [first_name], COUNT(m.sender_id) as number_of_messages
     FROM [Member]
LEFT JOIN [Message] m ON user_id = m.sender_id
                     AND m.message_type = 0
 GROUP BY [Member].[user_id], [first_name]
 ORDER BY number_of_messages DESC

私のクエリにはmessage_type、WHERE 句ではなく、JOIN 条件にフィルターが含まれていることに注意してください。OUTER 結合構文では配置が重要です。JOIN 句では、JOIN の前に条件が適用されます。WHERE 基準は JOIN の後に適用され、異なる結果をもたらす可能性があります。

于 2012-05-21T01:32:45.860 に答える
0

そのようなメッセージを持っていないメンバーも含めたい場合は、m.message_type = 0 を削除するだけです。他に方法はありません。全員を選択し、後で IF 句を使用して必要に応じて結果をフィルター処理します。

別の解決策として、タイプ 0 のユーザーごとにダミーのエントリを作成し、それらのメッセージを使用するときにそれらのメッセージを除外することが考えられます。

于 2012-05-21T01:46:59.420 に答える