2013-08-21 1 views
0

У меня есть таблица, которую я использую для хранения сообщений для разговора. Это мой запрос:Группа не работает должным образом в операторе выбора mysql

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, получаю сообщения, в которых ваш идентификатор находится в 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`); 

Это обеспечит список самого последних идентификаторов сообщений (при условии, что они назначены в порядке возрастания). Вы можете присоединиться к этому в своем запросе, чтобы получить последнее сообщение.

+0

Я не уверен, что я понимаю ваш запрос. Таблица сообщений содержит строки, которые являются сообщениями из нескольких разговоров. Я пытаюсь получить определенные строки из этой таблицы. Каждая из строк, которые я хочу, должна быть самым последним сообщением, которое обменивается между вами и другим человеком. Также необходимо упорядочить порядок возвращаемых строк, чтобы последний разговор был сверху. Также, когда группа по условию удовлетворяет более чем одной строке, я пытаюсь сделать ее так, чтобы она выбирала самую последнюю строку, потому что я помещал 'MAX (a.date sent) в качестве даты, отправленной сверху, так что это не делает выберете самую последнюю из них? – omega

+0

@omega. , , Ответ на ваш вопрос «нет». Если вы хотите самый последний, вам нужно рассчитать его и присоединиться к нему. –