我有以下表格用于消息传递应用程序:
`messaging_message`
- thread_id
- content
- timestamp
- sender_id
`messaging_messagestatus`
- thread_id # though redundant here, makes messaging queries much easier
- message
- recipient_id
- status
几点注意事项:
- 每条消息将有两个引用它的消息状态条目,一个用于消息线程中的每个用户。
- 单个消息线程中可能有多条消息。
- 一个用户可以删除一条消息(status='deleted'),一个用户删除一条消息显然不会为线程中的另一个用户删除相同的消息。
尽我最大的努力掌握 SQL 的基本知识,我创建了一个查询来获取:
给定一个用户,获取所有不同的未删除线程,显示 1) thread_id; 2) message_id // 3) timestamp // 4) 该线程中最新消息的内容;5) 消息线程中的其他人是谁;6) 用户是否发送了最新消息。这是我到目前为止所拥有的:
SELECT thread_id, message_id, timestamp, content,
(SELECT DISTINCT recipient_id FROM messaging_messagestatus ms WHERE ms.thread_id=thread_id
AND recipient_id !=4) as other_recipient,
(CASE WHEN sender_id=4 THEN True ELSE False END) as sent_last_message
FROM
( SELECT m.thread_id, recipient_id, timestamp, m.id as message_id, content, sender_id
FROM messaging_messagestatus ms
INNER JOIN messaging_message m
ON ms.message_id = m.id
WHERE recipient_id = 4 AND m.thread_id NOT in
( SELECT thread_id FROM messaging_messagestatus WHERE status='deleted'
AND recipient_id = 4)
ORDER BY timestamp DESC) combined GROUP BY thread_id
这个查询确实有效,会给我类似的东西:
thread_id message_id timestamp content other_recipient sent_last_message
2 3 2012-06-09 13:02:08 newest message 80 1
大约 20k 消息行 / 35k 状态行,第一个查询大约需要 14 秒!后续关于3s的查询。