Sql 如何查询存储在表中的消息,以便按发件人对消息进行分组,并按时间对组进行排序?

Sql 如何查询存储在表中的消息,以便按发件人对消息进行分组,并按时间对组进行排序?,sql,algorithm,hierarchical-data,hierarchical,Sql,Algorithm,Hierarchical Data,Hierarchical,总体方案:我将会话存储在一个表中,我需要检索特定位置的消息,以便将它们分组到会话中,并且会话组按照该组中接收到的最新消息进行排序。这类似于手机或facebook新闻订阅上的短信组织方式。我正在以下模式中存储消息: Location_id | SentByUser | Customer | Messsage | Time 1 | Yes | 555-123-1234 | Hello world |

总体方案:我将会话存储在一个表中,我需要检索特定位置的消息,以便将它们分组到会话中,并且会话组按照该组中接收到的最新消息进行排序。这类似于手机或facebook新闻订阅上的短信组织方式。我正在以下模式中存储消息:

Location_id | SentByUser | Customer     | Messsage         | Time                 
1           | Yes        | 555-123-1234 | Hello world      | 2013-12-01 10:00:00
1           | No         | 555-123-1234 | Thank you        | 2013-12-01 12:00:00 
1           | Yes        | 999-999-9999 | Winter is coming | 2013-12-03 11:00:20 
1           | Yes        | 555-123-1234 | Foo Bar          | 2013-12-02 11:00:00 
1           | No         | 999-999-9999 | Thank you        | 2013-12-04 13:00:00 
1           | Yes        | 111-111-1111 | Foo Foo Bar      | 2013-12-05 01:00:00
在本例中,如果我正在为位置id构建对话树,我希望得到以下输出:

Location_id | SentByUser | Customer     | Messsage         | Time                 
1           | Yes        | 111-111-1111 | Foo Foo Bar      | 2013-12-05 01:00:00
1           | Yes        | 999-999-9999 | Winter is coming | 2013-12-03 11:00:20 
1           | No         | 999-999-9999 | Thank you        | 2013-12-04 13:00:00 
1           | Yes        | 555-123-1234 | Hello world      | 2013-12-01 10:00:00
1           | No         | 555-123-1234 | Thank you        | 2013-12-01 12:00:00 
1           | Yes        | 555-123-1234 | Foo Bar          | 2013-12-02 11:00:00 
所以我想做的是按Customer字段对所有对话进行分组,然后按时间对组进行排序,最后对每个组中的消息进行排序。这是因为我正在构建一个类似于文本消息的界面。每个地点可能有数百个对话,我一次只展示几个。如果我确保我的查询输出是有序的,我就不必担心服务器维护任何状态。客户可以简单地说给我接下来的100条信息等等

我的问题有两个: 1.是否有一种简单的方法来获得子订单结果?有没有一种简单的方法,不需要对表本身进行复杂的连接,也不需要创建新表来维护某些顺序。 2.我这样做是一种很好的做法吗?与中一样,是否有更好的方法来存储和检索消息,以便服务器不必维护状态?那么,有没有更好的模式我应该考虑?


我看了各种各样的问题和答案,我能找到的最好的一个是,但它似乎并不完全适用于我的案例,因为作者谈论的是多分枝树

您似乎需要两个不同的查询。这是用T-SQL for SQL Server编写的,但可以很容易地适用于SQLite或MySQL或任何您正在使用的工具

1) 显示最近订购的客户群

select Location_id, Customer, Max(Time) as LatestMessageTime from #Table 
group by Location_id, Customer order by LatestMessageTime desc
这类似于文本消息应用程序的第一个视图

2) 在给定位置和客户id的情况下,按顺序显示消息

declare @Location int, @Customer varchar(900)
set @Location = 1
set @Customer = '999-999-9999'

select * from #Table where Location_id = @Location and Customer = @Customer 
order by Time desc
如果您只需要示例输出,则不需要太复杂的内容:

select t.*, g.MostRecentTime from #Table t LEFT OUTER JOIN
(select Location_id, Customer, Max(Time) as MostRecentTime from #Table
group by Location_id, Customer) g on g.Location_id = t.Location_id and g.Customer = t.Customer
order by MostRecentTime desc, Location_id, Customer, Time
这里有一把小提琴:


我认为这是一种可以接受的信息存储方式。至于检索它,我有两个不同的存储过程:给我“摘要”(上面1个),然后给我给定位置和客户的“消息”(上面2个)。我还想通过
订购。。。。客户,Time desc
,这样最新的消息将首先返回,然后它将“返回”到过去,而不是首先加载最旧的消息。

谢谢这真的很有帮助!我会沿着这条路走。谢谢你的帮助,不客气。如果你想进一步澄清,请在评论中告诉我。