2010-08-08 91 views
1
集團

我怎樣才能制定以下任務查詢:獲取最後一行PER

比方說,你登錄爲用戶: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");                                    

+0

只介於2人的談話?即用戶ID是否可以是對話中所有消息的'FromID'或'ToID'? – 2010-08-08 20:49:11

+0

是的對話只有兩個人之間 – user391986 2010-08-08 21:12:53

回答

1
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 
+0

嗨馬丁這很好! 只是情侶,我得到的消息不是來自對話的最新消息,我實際上真正在尋找的DateTime是其他用戶在此對話中發送的最後一條消息的時間。 – user391986 2010-08-08 21:14:44

+0

我認爲這個問題可能是您的測試表中的NOW(),這意味着所有的日期時間是相同的?如果是這樣,可以使用id。 – 2010-08-08 21:17:28

+0

就是這樣!這幾乎是完美的,我用新的數據編輯了這篇文章。最後一件事我怎麼也可以得到與我交談的用戶的ID還爲每一行(對話) – user391986 2010-08-08 21:37:02

1

的最後消息中的第一行的 「主題」看看@ROW_NUMBER() in MySQL - 你可以肯定的將它應用於你的問題。

1

你應該嘗試這樣的事:

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