2013-08-21 2 views
0

대화 용 메시지를 저장하는 데 사용하는 테이블이 있습니다.그룹별로 mysql select 문에서 제대로 작동하지 않습니다.

SELECT 
    a.id, 
    a.`from member_id`, 
    a.`to member_id`, 
    IF(a.`from member_id`={$targetID}, a.`to member_id`, a.`from member_id`) as other_id, 
    a.text, 
    MAX(a.`date sent`) as `date sent`, 
    a.to_read, 
    m.`first name`, 
    m.`last name`, 
    m.avatar_name, 
    m.avatar_status 
    FROM message a 
    JOIN members m on IF(a.`from member_id`={$targetID}, a.`to member_id`, a.`from member_id`) = m.id 
    WHERE (a.`from member_id`={$targetID} OR a.`to member_id`={$targetID}) AND a.active=1 
    GROUP BY IF(a.`from member_id`={$targetID}, a.`to member_id`, a.`from member_id`) 
    ORDER BY `date sent` DESC 

메시지 테이블이 같은입니다 :

id    int(11)   id of the message  
from member_id int(11)   id of the person the message was sent from 
to member_id  int(11)   id of the person the message was sent to 
date sent  datetime   date of when it was sent 
active   tinyint(1)  if the message is deleted  
text    longtext  the text of the message 
from_read  tinyint(1)  boolean to know if the person who sent it read it 
to_read   tinyint(1)   boolean to know if the person who it got sent to read it 

이 선택 사항이 현재 가지고 대화의 목록을 표시하는 데 사용됩니다 이것은 내 쿼리입니다. 예를 들어 Android 스마트 폰의 문자 메시지 아이콘을 클릭하면 대화 목록이 표시되며 사용자와 다른 사람간에 가장 최근의 메시지가 교환됩니다.

그래서 select 문에서 수행하는 작업은 사용자의 ID가 to 또는 from 인 메시지를 가져온 다음 사용중인 행이 나와 다른 사용자간에 가장 최근에 교환 된 메시지가되도록 그룹화합니다.

사람이 자기에게 텍스트를 보내면 가장 최근의 텍스트가 나타나지 않는 것이 문제입니다.

누구에게 무슨 문제가 있는지 알고 있습니까?

감사합니다.

답변

0

질문 인용하자면 : 그래서

내가 선택 성명에서 뭐하는 거지 것은 아이디가하거나 행하도록 을 사용하는 그룹은 다음에서에 메시지를 얻을 수있다 가장 최근의 메시지는 당신과 다른 사람 사이에 교환되었습니다.

원하는 작업 일 수 있습니다. 쿼리가하는 것이 아닙니다. group by 절은 :

GROUP BY IF(a.`from member_id`={$targetID}, a.`to member_id`, a.`from member_id`) 

이 조건을 충족 복수의 열 발생, 그것은 그 행에서 리치 필드에 대한 임의의 값을 선택한다. order by은 원하는 경우에도 가장 최근의 메시지를 선택하는 것과 아무런 관련이 없습니다.

두 보낸 사람 사이의 가장 최근의 메시지가하려면 다음을 수행하십시오

select least(`from member_id`, `to member_id`) as id1, 
     greatest(`from member_id`, `to member_id`) as id2, 
     max(id) as theid 
from messages m 
group by least(`from member_id`, `to member_id`), 
     greatest(`from member_id`, `to member_id`); 

이 가장 최근의 메시지 ID 목록 (그들은이 증가하는 순서로 할당 된 가정)을 제공 할 것입니다. 이 메시지를 쿼리에 결합하여 가장 최근의 메시지를 얻을 수 있습니다.

+0

검색어를 잘 모르겠습니다. 메시지 테이블에는 여러 대화의 메시지 인 행이 있습니다. 이 테이블에서 특정 행을 가져 오려고합니다. 각 행은 내가 원했던 것이고, 당신과 다른 사람 사이에 교환 된 가장 최근의 메시지 여야합니다. 또한 가장 최근의 대화가 맨 위에 오도록 리턴 된 행의 순서가 정렬되어야합니다. 조건별로 그룹이 하나 이상의 행을 만족할 때, 나는'MAX (a.date sent)를 보낸 날짜로 '를 맨 위에 놓았 기 때문에 가장 최근의 행을 선택하도록 만들려고합니다. 가장 최근의 것을 선택하여 그룹을 만드시겠습니까? – omega

+0

@omega. . . 귀하의 질문에 대한 대답은 "아니오"입니다. 가장 최근의 것을 원한다면, 그것을 계산하고 들어와야합니다. –

관련 문제