2013-02-04 1 views
3

메시징 시스템을 개발 중이며 쿼리를 작성하는 데 문제가 있습니다 (MYSQL). 간단히 말해서 각 대화 사용자가 사용자에게 마지막으로 한 메시지의 배열을 반환해야합니다.메시징 시스템 용 mysql 쿼리

SELECT * FROM tbl_message s1 WHERE s1.created_on IN (
    SELECT MAX(s2.created_on) 
     FROM tbl_message s2 WHERE s1.from_user=".$userID." OR s2.to_user=".$userID." 
     GROUP BY s2.from_user, s2.to_user) 
     AND status = 0"; 

잘 작동하지만, 나에게 FROM_USER 및 to_user 2 마지막 메시지 대신 모두 1 마지막 메시지를주고 :

CREATE TABLE 'tbl_message'('id' int(10) AUTO_INCREMENT, 
    'from_user' int(10), 
    'to_user' int(10), 
    'reply_to' int(10), 
    'subject', 
    'body' text, 
    'status' tinyint(3), 
    'deleted_from_sender' tinyint(3), 
    'deleted_from_recipient' tinyint(3)', 
    'created_on' datetime, 

나는 쿼리를 썼다. 그것은 GROUP BY 때문에 당연히 질문은 어떻게 내가 하위 쿼리에서 max created_on (실제로 mysql datestamp)을 찾을 수 있었 을까라는 것입니다. 또는 다른 해결책을 주시면 감사하겠습니다. 도움이나 조언을 해주십시오. 예를 들어 일부 데이터

+----+-------+--------+--------+---------------------+--------+---------+ 
| id | from_user | to_user | subject  | created_on   | status | 
+----+-------+--------+--------+---------------------+--------+---------+ 
| 1 | 68  | 128 | somesubject1 | 2013-07-01 21:31:29 |  0 | 
+----+-------+--------+--------+---------------------+--------+---------+ 
| 2 | 128 | 68 | somesubject2 | 2013-07-01 21:41:29 |  0 | 
+----+-------+--------+--------+---------------------+--------+---------+ 
| 3 | 128 | 68 | somesubject3 | 2013-07-01 21:51:29 |  0 | 
+----+-------+--------+--------+---------------------+--------+---------+ 
| 4 | 68  | 226 | somesubject4 | 2013-07-01 22:01:29 |  0 | 
+----+-------+--------+--------+---------------------+--------+---------+ 

쿼리의 출력

| 3 | 128 | 68 | somesubject3 | 2013-07-01 21:51:29 |  0 | 
+----+-------+--------+--------+---------------------+--------+---------+ 
| 4 | 68  | 226 | somesubject4 | 2013-07-01 22:01:29 |  0 | 
+0

샘플 데이터와 원하는 결과를 입력하고 업데이트 된 바이올린을 게시 할 수 있습니까? http://sqlfiddle.com/#!2/ac316 - 귀하의 답변을 얻는 데 도움이 될 것입니다. – sgeddes

+2

맬웨어를 호스팅하는 것으로 알려진 사이트에 이미지를 게시 할 수 있습니까? http://google.com/safebrowsing/diagnostic?site=radikal.ru/ – Oerd

+0

sgeddes가 업데이트되었습니다. 죄송 합니다만 그 곳에서 호스팅하는 이미지는 맬웨어가 없어야합니다. – Alekso

답변

0

당신은 할 수 : 유래와 MySQL 매뉴얼을 파고

2 일 후에는 DB의 교수 :

UPD 도움을 희망 이 쿼리를 사용하여 두 명의 사용자간에 최대 created_on 날짜를 얻으십시오.

SELECT 
    LEAST(from_user, to_user) user1, 
    GREATEST(from_user, to_user) user2, 
    MAX(created_on) max_created_on 
FROM 
    tbl_message 
GROUP BY 
    LEAST(from_user, to_user), 
    GREATEST(from_user, to_user) 

은 당신이 찾고있는 쿼리는 아마 이것이다 : 모두

SELECT t.* 
FROM 
    tbl_message t INNER JOIN (
    SELECT 
     LEAST(from_user, to_user) user1, 
     GREATEST(from_user, to_user) user2, 
     MAX(created_on) max_created_on 
    FROM 
     tbl_message 
    WHERE from_user=68 or to_user=68 
    GROUP BY 
     LEAST(from_user, to_user), 
     GREATEST(from_user, to_user)) M 
    on t.created_on = M.max_created_on 
    AND LEAST(t.from_user, t.to_user)=user1 
    AND GREATEST(t.from_user, t.to_user)=user2 

참조 바이올린 here를 조회합니다.

+0

그것은 MySQL에서 작동합니까? – Alekso

+0

@Alekso 예, pls이 피들을 참조하십시오 http://sqlfiddle.com/#!2/4b7383/2 – fthiella

+0

grazie mille! :)이 기능이 성능에 어떤 영향을 주는지 명확히하기 위해 노력하고 있습니다. – Alekso