第一顺序,然后分组

时间:2016-06-14 15:41:56

标签: mysql sql sql-order-by

我有一个包含消息的表(person_id,message,conversation_id,created_at)

我想在每个对话中获得最新消息..我尝试过子查询,但似乎忽略了子查询中的orderby:

SELECT sub.* FROM 
      (SELECT * FROM messages ORDER BY created_at DESC) AS sub
GROUP BY sub.conversation_id

在这个SQLfiddle中试试。

获得正确结果的其他任何方式?

http://sqlfiddle.com/#!9/12739/1

4 个答案:

答案 0 :(得分:3)

如果您想要每个对话的所有最新消息,您可以通过

使用选择组中的位置
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);

答案 1 :(得分:1)

尝试这种方式:

nameofprocesseddf = substr(dataframes[i],start = 1,stop = str_length(dataframes[i])-4)

答案 2 :(得分:1)

无法在sqlfiddle上测试这个,它不适合我:

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

答案 3 :(得分:1)

您可以使用选择列表中的相关子查询执行此操作,也可以使用from列表中的子查询连接回主表。

相关子查询:

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

2方法之间的区别在于相关子查询将始终为每个会话ID返回1条记录。如果2个记录具有相同的created_at值,则第二个可以返回每个对话超过1个记录。如果有一个自动递增的id字段唯一标识每个消息,那么您可以使用此字段的最大值而不是在字段中创建的字段来解决此潜在问题。