我正在使用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
答案 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子句的一部分。