2010-08-08 3 views
1

PER 마지막 행을 가져옵니다. 내가 얻을하려는 각 행에 대해 , 대화 첫 번째 행의 "날짜 시간" "메시지"그것을하는 방법은 아래의 작업에 대한 쿼리를 공식화 할 수 그룹

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

있습니까? 즉, 대화 내 모든 메시지에 대해 사용자 ID가 'FromID'또는 'ToID'가 될 것인가? –

+0

네 대화는 두 사람 사이에서만 가능합니다 – user391986

답변

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

+0

나는 모든 datettimes가 동일하다는 것을 의미하는 테스트 테이블의'NOW()'문제가 될 것이라고 생각하십니까? 그렇다면 id를 대신 사용할 수 있습니다. –

+0

그게 전부 야! 이것은 거의 완벽하고 새로운 데이터로 게시물을 편집했습니다. 마지막으로 각 행 (대화)에 대해서도 나와 대화하는 사용자의 ID를 얻는 방법 – user391986

1

를 썼다 상관없이이 대화의 마지막 메시지에서 첫 번째 행의 "제목" @ROW_NUMBER() in MySQL을보십시오 - 문제에 확실히 적용 할 수 있습니다.

1

당신이 뭔가를 시도해야합니다 : 단 2 사람 사이의 대화가

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 
관련 문제