按另一个表列mysql排序
我有两个表,按另一个表列mysql排序,mysql,sql,Mysql,Sql,我有两个表,messages和threadmessages是主表,thread是我保存两个用户之间对话的地方。我只想从消息表中选择,并从线程表中按线程id排序。我正在使用下面的sql,但它的顺序不是我想要的 我的目标是当新消息插入到线程表中时,使消息表中的父消息显示在顶部。有人知道吗 SELECT m.* FROM messages AS m JOIN thread AS t ON t.thread_id = m.id WHERE ( m.to_user =
messages
和thread
messages是主表,thread是我保存两个用户之间对话的地方。我只想从消息
表中选择,并从线程
表中按线程id
排序。我正在使用下面的sql,但它的顺序不是我想要的
我的目标是当新消息插入到线程
表中时,使消息
表中的父消息显示在顶部。有人知道吗
SELECT m.*
FROM messages AS m
JOIN thread AS t
ON t.thread_id = m.id
WHERE ( m.to_user = ?
AND m.deleted != ?
AND m.del2 != ?)
OR
(m.from_user = ?
AND m.conversation = 'true'
AND m.deleted != ?
AND m.del2 != ?)
ORDER BY t.thread_id desc);
消息表
id to_user from_user message is_read deleted del2 conversation
----------------------------------------------------------------------------------------
1 user1 user2 hi mark, true true
2 user3 user4 wass up yo? true true
3 user1 user3 blah blah
thread_id thread_to_user thread_from_user thread_message thread_message_id thread_is_read
---------------------------------------------------------------------------------------------------
1 user2 user1 hi there, 1 1
2 user1 user2 hey, wassup 1 1
3 user2 user1 not much, hw u doin 1 1
4 user1 user2 doing great and you? 1 0
5 user3 user4 heyyyy 2 1
6 user4 user3 hi, u coming? 2 0
线程表
id to_user from_user message is_read deleted del2 conversation
----------------------------------------------------------------------------------------
1 user1 user2 hi mark, true true
2 user3 user4 wass up yo? true true
3 user1 user3 blah blah
thread_id thread_to_user thread_from_user thread_message thread_message_id thread_is_read
---------------------------------------------------------------------------------------------------
1 user2 user1 hi there, 1 1
2 user1 user2 hey, wassup 1 1
3 user2 user1 not much, hw u doin 1 1
4 user1 user2 doing great and you? 1 0
5 user3 user4 heyyyy 2 1
6 user4 user3 hi, u coming? 2 0
我在回应这一行时所期待的是:
id to_user from_user message is_read deleted del2 conversation
----------------------------------------------------------------------------------------
2 user3 user4 wass up yo? true true
1 user1 user2 hi mark, true true
3 user1 user3 blah blah
试试这个:
SELECT DISTINCT(id), to_user,from_user,
message, is_read, conversation
FROM messages
LEFT JOIN (
SELECT thread_id, thread_message_id
FROM messages m
LEFT JOIN thread t
ON m.id = t.thread_message_id
) tbl
ON messages.id = tbl.thread_message_id
ORDER BY tbl.thread_id DESC
看
您可以将WHERE
放入子查询中,如:
SELECT DISTINCT(id), to_user,from_user,
message, is_read, conversation
FROM messages
LEFT JOIN (
SELECT thread_id, thread_message_id
FROM messages m
LEFT JOIN thread t
ON m.id = t.thread_message_id
WHERE ( m.to_user = ?
AND m.deleted != ?
AND m.del2 != ?)
OR
(m.from_user = ?
AND m.conversation = true
AND m.deleted != ?
AND m.del2 != ?)
) tbl
ON messages.id = tbl.thread_message_id
ORDER BY tbl.thread_id DESC
看
更新(与子查询一起使用MAX()
)
请参考下面的查询和小提琴示例
select m.id, max(t.thread_id) thread_id, m.to_user,m.from_user,m.message, m.is_read, m.conversation
from messages m
left join thread t on(t.thread_message_id = m.id)
group by t.thread_message_id
order by thread_id desc;
要按线程id排序,它应该出现在结果中。因此,只需将其添加到您的
选择中
,它就会按预期顺序排列消息
表中id为3的第三条记录,在你的线程
表中,它与哪条记录有关?@Edper这些用户之间还没有开始对话,因此当user1看到消息并回复时,回复进入线程
表,其中包含线程_message\u id=3
检查下面@user3006683的我的答案。我希望这就是你正在寻找的东西,否则请告诉我我在哪里想念它;-)我应该把放在哪里?
?好吧,我试过你的答案,但不知怎么的,它还是没有排序。即使我插入新行,与该消息\u id关联的父行也不会出现在顶部。@user3006683:我想我对这一行的分析过度了。我使用了Salim Mujawar的答案,但是做了一些更改,比如GROUP BY
,并将其作为子查询
。感谢它现在可以工作了,如果新消息到达时会话还没有开始,是否可以在顶部显示,就像消息表上id为3的消息一样?@user3006683。尝试将ORDER BY
更改为:ORDER BY m.conversation asc,thread\u id desc