Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 先订购,然后分组_Mysql_Sql_Sql Order By - Fatal编程技术网

Mysql 先订购,然后分组

Mysql 先订购,然后分组,mysql,sql,sql-order-by,Mysql,Sql,Sql Order By,我有一个包含消息的表(person\u id、message、conversation\u id、created\u at) 我想在每次谈话中得到最新消息。。我尝试使用子查询,但它似乎忽略了子查询中的orderby: SELECT sub.* FROM (SELECT * FROM messages ORDER BY created_at DESC) AS sub GROUP BY sub.conversation_id 试试这把小提琴 还有其他方法可以得到正确的结果吗 尝试以下

我有一个包含消息的表(person\u id、message、conversation\u id、created\u at)

我想在每次谈话中得到最新消息。。我尝试使用子查询,但它似乎忽略了子查询中的orderby:

SELECT sub.* FROM 
      (SELECT * FROM messages ORDER BY created_at DESC) AS sub
GROUP BY sub.conversation_id
试试这把小提琴

还有其他方法可以得到正确的结果吗

尝试以下方法:

SELECT m1.*
FROM messages AS m1
JOIN (
   SELECT conversation_id, MAX(created_at) AS created_at
   FROM messages
   GROUP BY conversation_id
) AS m2 ON m1.conversation_id = m2.conversation_id AND m1.created_at = m2.created_at

无法在sqlfiddle上测试此功能,它对我不起作用:

SELECT m1.* 
  FROM messages m1
 WHERE m1.created_at =
      (SELECT max(created_at) 
         FROM messages m2
        where m1.conversation_id=m2.conversation_id)

可以使用“选择”列表中的相关子查询或“发件人”列表中的子查询连接回主表来执行此操作

相关子查询:

SELECT DISTINCT m1.conversation_id, (SELECT * FROM messages m2 WHERE m2.conversation_id=m1.conversation_id ORDER BY created_at DESC LIMIT 1)
FROM messages m1
from子句中的子查询:

SELECT m1.*
FROM messages as m1
JOIN (
   SELECT conversation_id, max(created_at) AS max_created_at
   FROM messages
   GROUP BY conversation_id
) m2 on m1.conversation_id = m2.conversation_id and m1.created_at = m2.max_created_at

两种方法之间的区别在于,相关子查询始终会为每个会话id返回1条记录。如果两条记录具有相同的created_at值,则第二个子查询可能会为每个会话返回1条以上的记录。如果存在唯一标识每条消息的自动递增id字段,则可以使用此字段的最大值而不是“创建时间”字段来解决此潜在问题。

如果希望每个对话的所有最新消息,则可以使用“选择群组中的where in”

SELECT messages.* 
FROM messages 
WHERE (messages.created_at, messages.conversation_id) in 
  (SELECT max(created_at) , conversation_id
     FROM messages messages
     Group by conversation_id);

很抱歉这是一个错误:)可能是重复的谢谢!这是最优化的方法吗?另一种方法是在同一个表上按..分组的内部联接。。asnwer中的查询可能是最优化的。但是结果可能取决于表的实际填充量。。