Mysql 构建SQL查询以联接三个表以获取消息传递信息
对于消息传递系统,我有以下三个表:Mysql 构建SQL查询以联接三个表以获取消息传递信息,mysql,sql,Mysql,Sql,对于消息传递系统,我有以下三个表: `messaging_messagethread` - id - subject - initiator_id # who creates the thread - recipient_id `messaging_message` - id - thread_id - content - timestamp - sender_id `messaging_messagestatus` # a status will be created for each r
`messaging_messagethread`
- id
- subject
- initiator_id # who creates the thread
- recipient_id
`messaging_message`
- id
- thread_id
- content
- timestamp
- sender_id
`messaging_messagestatus` # a status will be created for each recipient of a message
- id
- message_id
- recipient_id
- status
给定一个用户,我需要构建一个查询以获得以下内容:
- 显示线程ID(不同)
- 该线程中最新消息的
和内容
时间戳
- 删除包含最新消息
的所有线程李>status='deleted'
SELECT DISTINCT thread.id as thread_id, timestamp.timestamp
FROM messaging_messagethread thread
INNER JOIN
(SELECT thread_id, MAX(timestamp) as timestamp
FROM messaging_message GROUP BY thread_id) timestamp
ON thread.id = timestamp.thread_id
WHERE initiator_id = 4 OR thread.recipient_id = 4 ORDER BY timestamp.timestamp DESC
这将根据最近的时间戳为我提供不同的线程id。(三点中的第一点)。如何构建整个查询?问题是您需要每个线程的最新消息, 不幸的是,在一个团队中无法检索到顶级成员 因此,我所做的基本上是从每个线程id获取所有消息 用户只需返回最上面的id。。。哦,还有检查 该邮件尚未被删除。 我不确定这是否正确 但请重新考虑使用编程语言的不同方法, 或多个查询。 因为这会很慢
SELECT thread_id, content, timestamp
FROM messaging_message
WHERE messaging_message.id IN
(
SELECT messaging_message.id
FROM messaging_message
INNER JOIN messaging_messagestatus ON
(messaging_messagestatus.message_id = messaging_message.id)
WHERE messaging_message.thread_id IN
(SELECT DISTINCT id
FROM messaging_messagethread
WHERE initiator_id = 4 OR recipient_id = 4) AND
messaging_messagestatus.status != 'deleted'
ORDER BY timestamp DESC
LIMIT 1
)
ORDER BY timestamp DESC
祝您好运。您可以使用相关子查询来获取特定线程的最新消息。试试这个:
SELECT
a.id,
b.content,
b.timestamp
FROM
messaging_messagethread a
INNER JOIN
messaging_message b ON a.id = b.thread_id
WHERE
b.timestamp =
(
SELECT MAX(timestamp)
FROM messaging_message
WHERE thread_id = a.id
)
AND b.id NOT IN
(
SELECT message_id
FROM messaging_messagestatus
WHERE status = 'deleted'
)
AND 4 IN (a.initiator_id, a.recipient_id)
ORDER BY
b.timestamp DESC
如果我理解正确,我相信这就是你想要的