如何向COUNT()添加更多结果

时间:2014-08-06 23:24:00

标签: sql

我正在使用COUNT函数查找单位上的对话次数。邮件的收件人ID为to_id,发件人的ID为from_id。我将对话定义为两个id独有的所有消息。因此,一个单元上的两个用户独有的所有消息。

(select count(distinct to_id) 
 from messages 
 where unit_id = units.id AND units.creator_id = from_id) as messages

这部分有效。但问题是它还没有计算creator_id = to_id和创建者没有发回消息的对话。

因此,我要么创建一个单独的查询来计算所有这些特定的消息,然后将其添加到计数中,或者尝试找出如何将此功能添加到原始查询中。我不知道如何添加SQL或如何做到这两点。

以下是完整的陈述:

SELECT 
   messages.*, units.*, 
   MAX(messages.created_at) AS 'conversation_date', 
   (select count(distinct to_id) 
    from messages 
    where unit_id = units.id AND units.creator_id = from_id) as messages,
   WEEKOFYEAR(MAX(messages.created_at)) as 'woy', 
   YEAR(MAX(messages.created_at)) as 'year',
   classifications.description AS 'classification'
FROM 
   messages 
JOIN 
   units ON units.id = messages.unit_id
JOIN 
   classifications ON units.classification_id = classifications.id
WHERE 
   from_id <> units.creator_id 
GROUP BY 
   messages.unit_id, from_id, to_id

2 个答案:

答案 0 :(得分:0)

    (
    (select count(distinct to_id) from messages where unit_id = units.id AND units.creator_id = from_id)
    +
    (select count(distinct to_id) from messages where unit_id = units.id AND units.creator_id = to_id )
    )

 as messages

OR

(
select count(distinct to_id) from messages where unit_id = units.id AND units.creator_id IN (from_id,to_id)
)
 as messages

这是你想要实现的目标吗?

答案 1 :(得分:0)

不确定我是否真的关注,提供样本数据和预期结果会使您的意图更容易理解。

但是,我think你只需要相关子查询中的OR条件。像这样:

SELECT
      messages.*                                        --<< note                     
    , units.*                                           --<< note   
    , MAX(messages.created_at) AS 'conversation_date'
    , (
            SELECT
                  COUNT(DISTINCT m.to_id)
            FROM messages as m                           --<< change
            WHERE units.id = m.unit_id                   --<< change
                  AND units.creator_id = m.from_id       --<< change
                  OR units.creator_id = m.to_id          --<< NEW
      )                                    
                                           AS messages
    , WEEKOFYEAR(MAX(messages.created_at)) AS 'woy'
    , YEAR(MAX(messages.created_at))       AS 'year'
    , classifications.description          AS 'classification'
FROM messages
      JOIN units
                  ON units.id = messages.unit_id
      JOIN classifications
                  ON units.classification_id = classifications.id
WHERE from_id <> units.creator_id
GROUP BY
      messages.unit_id
    , from_id
    , to_id

我将其更改为使用表别名m,如果没有它们,很容易迷失在哪个表中。

注意:我应该提到使用messages.*, units.*不是一个好习惯,select子句中需要的任何非聚合字段都应该是group by子句的一部分。