我有一个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
答案 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
答案 1 :(得分:0)
如果我理解你的问题,这个查询应该按照你想要的方式排序:
select * from 'mytable'
ORDER by timestamp asc,
CASE WHEN "sender"="101"
THEN "to"
ELSE "sender" END