0

假设我有两张桌子:

成员

------------------------
| 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

使用外连接:

   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在 JOIN 条件中包含过滤器——而不是在 WHERE 子句中。放置对于 OUTER 连接语法很重要——在 JOIN 子句中应用 JOIN 之前的条件。WHERE 标准在 JOIN 之后应用,并且可以给出不同的结果。

于 2012-05-21T01:32:45.860 回答
0

如果您也想包含没有此类消息的成员,您只需删除 m.message_type = 0,我没有看到其他方法。选择所有人并稍后使用 IF 子句根据您的需要过滤结果。

另一种解决方案可能是您为每个类型为 0 的用户创建一个虚拟条目,并在使用它们时过滤掉这些消息。

于 2012-05-21T01:46:59.420 回答