电子邮件线程视图的SQL问题

电子邮件线程视图的SQL问题,sql,sql-server,coldfusion,Sql,Sql Server,Coldfusion,我想查询一个线程列表,其中每个会话显示最新消息max(date),以及会话中有多少消息的计数count(*),按线程ID分组 这是SQL表 Message ------------- messageID (int) subject (varchar) ... date (date) threadID (guid) 如何在一个查询中生成以下内容?在Gmail这样的线程视图中 还是数据结构错误?也许我应该将所需的数据反规范化为线程表?使用触发器更新最后一个消息ID和计数 谢谢 更新 我还需要“ma

我想查询一个线程列表,其中每个会话显示最新消息
max(date)
,以及会话中有多少消息的计数
count(*),按线程ID分组

这是SQL表

Message
-------------
messageID (int)
subject (varchar)
...
date (date)
threadID (guid)
如何在一个查询中生成以下内容?在Gmail这样的线程视图中

还是数据结构错误?也许我应该将所需的数据反规范化为
线程
表?使用触发器更新最后一个消息ID和计数

谢谢

更新
我还需要“max([date])”的主题,并在最后一条消息的日期前订购该线程,谢谢

假设
threadID
是对话的唯一链接,除非我遗漏了什么,否则应该可以:

SELECT threadID, count(messageID) as MessageCount, max([date]) as MaxDate
FROM Message
GROUP BY threadID
您可能还需要更改
日期
列名,因为这是一个保留字

编辑需求变更

由于您没有指定电子邮件主题是否会更改(“第一封电子邮件中的“Hey”在第二封电子邮件中可能是“RE:Hey”作为响应),因此我已经完成了一个子查询,以便您可以从
消息
表(M1)中提取所需的任何信息

SELECT M1.subject, M1.date, M2.MessageCount
FROM 
Message M1
INNER JOIN (
    SELECT threadID, count(messageID) as MessageCount, 
         max([date]) as MaxDate, max(messageID) as MaxMessageID
    FROM [Message]
    GROUP BY threadID
) M2 ON
M1.threadID = M2.threadID and M1.MessageID = M2.MaxMessageID
ORDER BY M1.[date] DESC

假设
threadID
是对话的唯一链接,除非我遗漏了什么,否则应该可以:

SELECT threadID, count(messageID) as MessageCount, max([date]) as MaxDate
FROM Message
GROUP BY threadID
您可能还需要更改
日期
列名,因为这是一个保留字

编辑需求变更

由于您没有指定电子邮件主题是否会更改(“第一封电子邮件中的“Hey”在第二封电子邮件中可能是“RE:Hey”作为响应),因此我已经完成了一个子查询,以便您可以从
消息
表(M1)中提取所需的任何信息

SELECT M1.subject, M1.date, M2.MessageCount
FROM 
Message M1
INNER JOIN (
    SELECT threadID, count(messageID) as MessageCount, 
         max([date]) as MaxDate, max(messageID) as MaxMessageID
    FROM [Message]
    GROUP BY threadID
) M2 ON
M1.threadID = M2.threadID and M1.MessageID = M2.MaxMessageID
ORDER BY M1.[date] DESC

哦,在最后一条消息的日期前订购线程。。。对不起,问题问得不够清楚。@Henry-你真的应该用要求更新你的问题。无论如何,我已经更新了我的答案。另外,在要求改变之前,你不喜欢我的原始答案中的什么?如果我说了什么错误,我想从中学习,并知道未来。哦,并在最后一条消息的日期订购线程。。。对不起,问题问得不够清楚。@Henry-你真的应该用要求更新你的问题。无论如何,我已经更新了我的答案。另外,在要求改变之前,你不喜欢我的原始答案中的什么?如果我说错了什么,我想从中吸取教训,为将来着想。