如何按日期,会话线程对数据库中的所有会话进行分组

时间:2014-05-29 18:19:16

标签: sql sqlite

我有一个sqllite数据库,其中包含已接收和已发送消息的日志。

id    sender   to   msg                    timestamp
1     2        9    1-1                    201
2     9        2    1-2                    202
3     1        9    2-1                    203
4     9        2    1-3                    204
5     9        1    2-2                    205

我可以通过时间戳对它们进行排序,但是当对话重叠时,就像上面的示例(9,2和1之间)一样,它会降低可读性。

如何通过对话显示它们?

即:

id    sender   to   msg                    timestamp
1     2        9    1-1                    201
2     9        2    1-2                    202
4     9        2    1-3                    204
3     1        9    2-1                    203
5     9        1    2-2                    205

在我的数据库中,所有对话都在9和另一个数字之间,因此例如2和1永远不会有对话。

我已将数据输入SQLFiddle here

2 个答案:

答案 0 :(得分:3)

要按照启动的顺序进行对话,您需要自行加入表格以获得每次会话的最小时间戳,然后只需按照最小ID来获取按顺序进行的对话,其次是按顺序获取消息的消息的时间戳。

SELECT a.id, a.sender, a."to", a.msg, a.timestamp
FROM table1 a
JOIN table1 b
  ON CASE WHEN a.sender=9 THEN a."to" ELSE a.sender END =
     CASE WHEN b.sender=9 THEN b."to" ELSE b.sender END 
GROUP BY a.id, a.sender, a."to", a.msg, a.timestamp
ORDER BY MIN(b.timestamp), a.timestamp

An SQLfiddle to test with

答案 1 :(得分:0)

如果我理解你的问题,这个查询应该按照你想要的方式排序:

select * from 'mytable'
  ORDER by timestamp asc,
  CASE WHEN "sender"="101"
  THEN "to"
  ELSE "sender" END