Sql 获取每组的最后一行

Sql 获取每组的最后一行,sql,mysql,greatest-n-per-group,Sql,Mysql,Greatest N Per Group,如何为以下任务制定查询: 假设您以用户身份登录:1 我想在每次对话中获得一行。 对于我想要得到的每一行 对话中第一行的主题 第一行的日期时间 留言本次对话的最后一条留言,无论是谁写的 CREATE TABLE messages ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, FromID INT NOT NULL, ToID INT NOT NULL, ConversationID INT NOT NULL

如何为以下任务制定查询:

假设您以用户身份登录:1 我想在每次对话中获得一行。 对于我想要得到的每一行 对话中第一行的主题 第一行的日期时间 留言本次对话的最后一条留言,无论是谁写的

CREATE TABLE messages ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, FromID INT NOT NULL, ToID INT NOT NULL, ConversationID INT NOT NULL, Subject varchar(255), Message varchar(255), DateTime DATETIME ) ENGINE=InnoDB; CREATE TABLE conversations ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY ) ENGINE=InnoDB; INSERT INTO conversations (ID) VALUES (1), (2), (3); INSERT INTO messages (FromID, ToID, ConversationID, Subject, Message, DateTime) VALUES (1,2, 1, "Hi", "This is a test message", "2010-08-08 16:23:48"); INSERT INTO messages (FromID, ToID, ConversationID, Subject, Message, DateTime) VALUES (1,2, 1, "", "Hey again you have not answered", "2010-08-08 16:23:52"); INSERT INTO messages (FromID, ToID, ConversationID, Subject, Message, DateTime) VALUES (2,1, 1, "", "Hi this is my answer", "2010-08-08 16:23:59"); INSERT INTO messages (FromID, ToID, ConversationID, Subject, Message, DateTime) VALUES (2,1, 2, "2.Hi", "2.This is a test message", "2010-08-08 16:25:48"); INSERT INTO messages (FromID, ToID, ConversationID, Subject, Message, DateTime) VALUES (1,2, 2, "", "2.Hi back", "2010-08-08 16:25:52"); INSERT INTO messages (FromID, ToID, ConversationID, Subject, Message, DateTime) VALUES (2,1, 2, "", "2.Hi this is my answer", "2010-08-08 16:25:59"); INSERT INTO messages (FromID, ToID, ConversationID, Subject, Message, DateTime) VALUES (2,1, 3, "3.Hi", "3.This is a test message", "2010-08-08 16:27:48"); INSERT INTO messages (FromID, ToID, ConversationID, Subject, Message, DateTime) VALUES (1,2, 3, "", "2.Hi back", "2010-08-08 16:27:52"); INSERT INTO messages (FromID, ToID, ConversationID, Subject, Message, DateTime) VALUES (1,2, 3, "", "2.Hello are you there?", "2010-08-08 16:27:59");
看一看@你肯定能把这个应用到你的问题上。

你应该试试这样的方法:

SELECT M.ConversationID, 
MAX(CASE WHEN M.DateTime = X.FirstRow THEN M.Subject END) AS Subject,
CAST(COALESCE(MAX(CASE WHEN M.DateTime = X.LastRowSentByOtherUser 
                       THEN M.DateTime END),X.LastRow) AS DateTime)AS LastTime,
MAX(CASE WHEN M.DateTime = X.LastRow THEN M.Message END) AS Message,
MAX(CASE WHEN FromID = 1 THEN ToID ELSE FromID END) AS OtherParticipantId
FROM messages M
JOIN (
    SELECT ConversationID, MIN(DateTime) AS FirstRow, MAX(DateTime) AS LastRow,
    MAX(CASE WHEN FromID<>1 THEN DateTime END) AS LastRowSentByOtherUser
    FROM messages
    WHERE FromID=1 OR ToID=1
    GROUP BY ConversationID
) X ON X.ConversationID = M.ConversationID
AND (M.DateTime IN (X.FirstRow, X.LastRow, X.LastRowSentByOtherUser))
GROUP BY M.ConversationID
HAVING MAX(CASE WHEN M.DateTime = X.LastRowSentByOtherUser 
                   THEN M.DateTime END) IS NOT NULL
SELECT 
   m1.Subject,
   m1.DateTime,
   m2.Message
FROM conversations c 
INNER JOIN 
   (SELECT MIN(ID) AS minID, 
           MAX(ID) AS maxID, 
           ConversationID
   FROM messages
   WHERE FromID = @userID OR ToID = @userID
   GROUP BY ConversationID) AS cGrouped
ON c.ConversationID = cGrouped.ConversationID
INNER JOIN messages m1 ON m1.ID = cGrouped.minID
INNER JOIN messages m2 ON m2.ID = cGrouped.maxID

对话只在两个人之间进行吗?i、 e.对于对话中的所有消息,userid是FromID还是ToID?是的,对话只在两个人之间进行。嗨,马丁,这很好!!还有几件事,我收到的消息不是对话中的最新消息,我实际上要查找的DateTime是对话中其他用户发送的最后一条消息的时间。我想问题可能是测试表中的NOW,这意味着所有DateTime都是相同的?如果是这样的话,可以用id来代替。是的,就是这样!这几乎是完美的,我用新数据编辑了这篇文章。最后一件事,我如何才能获得与我进行对话的用户的ID,以及每行对话的ID我认为我的编辑应该适用于澄清的规范,当然,根据一些数据测试它!哇:我不知道这是怎么回事,非常感谢,很抱歉添加了一些我刚刚意识到的东西,但是我能不能也得到每个返回行与我对话的用户的ID?