按另一个表列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