2016-07-22 4 views
0

안녕하세요, PHP에서 직접 메시지받은 편지함을 만들려고합니다. 로그인 한 사용자와 로그인 한 사용자가 메시지를 보내거나 로그인 한 사용자에게 메시지를 보낸 사람간에 최신 메시지를 가져 오는 쿼리를 만들려고했습니다. Insatagram과 twitter가받은 편지함에서 로그인 한 사용자와 메시지가 있거나 메시지를 보낸 사람들 간의 모든 대화 목록을 표시하는 것과 비슷합니다.직접 메시지에 대한 MySql 쿼리

현재 내 쿼리는 로그인 한 사용자와 다른 사용자와의 최신 메시지 만 필요로 할 때 대화 한 사람들 간의 모든 대화를 표시합니다. 나는 이것을 충분히 설명하기를 희망한다.

지금 같은 내 쿼리 문은 다음과 같습니다 예를 들어

CREATE TABLE IF NOT EXISTS dm ( 
    id INT(11) NOT NULL AUTO_INCREMENT, 
    receiver VARCHAR(100) NOT NULL, 
    sender VARCHAR(100) NOT NULL, 
    senttime DATETIME NOT NULL, 
    message TEXT NOT NULL, 
    PRIMARY KEY (id) 
) 

:

id receiver sender  senttime   message 
1  Jack Will  2016-07-20 20:59:27  Hi 
2  Jack Bob  2016-07-21 20:59:27  What's up 
3  Bob Jack  2016-07-22 20:59:27  Hanging out what about 

가 반환해야 잭 경우 다음

SELECT * 
FROM dm 
WHERE(receiver="user") or (sender="user") 
ORDER BY senttime DESC; 

내 직접 메시지 테이블은 다음과 같습니다 검색어의 사용자입니다.

id receiver sender  senttime   message 
3  Bob Jack  2016-07-22 20:59:27  Hanging out what about you? 
1  Jack Will  2016-07-20 20:59:27  Hi 

답변

3

(sqlfiddle 참조) 같은 것을보십시오 :

SELECT * FROM dm 
INNER JOIN 
(
    SELECT MAX(id) as id FROM ( 
    SELECT MAX(id) as id, receiver as contact 
    FROM dm 
    WHERE sender="Jack" 
    GROUP BY receiver 
    UNION ALL 
    SELECT MAX(id) as id, sender as contact 
    FROM dm 
    WHERE receiver="Jack" 
    GROUP BY sender 
) t GROUP BY contact 
) d 
ON dm.id = d.id 
ORDER BY senttime DESC; 

출력은 다음과 같습니다

id receiver sender senttime    message 
3 Bob   Jack July, 22 2016 20:59:27 Hanging out what about 
1 Jack  Will July, 20 2016 20:59:27 Hi 

실행이 코드를 테스트 데이터를 생성 :

CREATE TABLE IF NOT EXISTS dm ( 
    id INT(11) NOT NULL AUTO_INCREMENT, 
    receiver VARCHAR(100) NOT NULL, 
    sender VARCHAR(100) NOT NULL, 
    senttime DATETIME NOT NULL, 
    message TEXT NOT NULL, 
    PRIMARY KEY (id) 
); 

INSERT INTO dm (receiver, sender, senttime, message) VALUES 
('Jack', 'Will', '2016-07-20 20:59:27', 'Hi'), 
('Jack', 'Bob', '2016-07-21 20:59:27', 'What\'s up'), 
('Bob', 'Jack', '2016-07-22 20:59:27', 'Hanging out what about'); 
+0

이되지 않습니다 작업. 쿼리는 Jack 및 Bob과 보낸 사람 및받는 사람 값을 구별하지 않습니다. – JoOlay

+0

코드 –

+0

의 새 버전을 사용해보세요. 정말 고마워요! 그것은 작동합니다! – JoOlay