我有一个包含消息的表(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中试试。
获得正确结果的其他任何方式?
答案 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字段唯一标识每个消息,那么您可以使用此字段的最大值而不是在字段中创建的字段来解决此潜在问题。