总体方案:我将对话存储在表中,我需要检索特定位置的消息,以便将它们分组为对话,然后按该组中收到的最新消息对对话组进行排序。这类似于在电话上或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
因此,我想按“客户”字段对所有对话进行分组,然后按“时间”对分组进行排序,最后对每个组内的消息进行排序。这是因为我正在构建类似于短信的界面。对于每个位置,可能会有数百个对话,而我一次只会显示几个对话。如果我确保查询输出是有序的,则不必担心服务器保持任何状态。客户可以简单地说出接下来的100条消息给我,等等。
我的问题有两个:1.是否有一种简单的方法可以对结果进行订购?是否有一种简单的方法,而无需对表本身进行复杂的联接或创建新表来维护某些顺序。2.我采用的这种做法是一种好的做法吗?与之类似,是否有更好的方法来存储和检索消息,以使服务器不必维护状态?在这种情况下,我是否应该考虑一个更好的模式?
我查看了各种问题和答案,而我能找到的最好的问题是将平板餐桌解析成树的最有效/最优雅的方法是什么?,但这似乎并不完全适用于我的情况,因为作者正在谈论多分支树。
似乎您想要两个不同的查询。这是用SQL Server的T-SQL编写的,但可以轻松地适用于SQLite或MySQL或您正在使用的任何东西。
1)告诉我最近订购的客户组
select Location_id, Customer, Max(Time) as LatestMessageTime from #Table
group by Location_id, Customer order by LatestMessageTime desc
这类似于您的短信应用程序的第一个视图。
2)在给定Location_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
这是它的一个SQLFiddle:http ://sqlfiddle.com/#!6/ae3f8/1/0
我认为这是一种存储信息的可接受方法。至于检索它,我将有两个不同的存储过程:给我“摘要”(上面的1),然后给我给定位置和客户的“消息”(上面2)。我也要按顺序排列,.... Customer, Time desc
以便最先返回最新的消息,然后它“返回”到过去,而不是先加载最早的消息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句