2016-08-06 6 views
0

У меня есть таблица сообщений, которая содержит id, sender_id, receiver_id, message and conversation_idПолучить последнее сообщение от каждого разговора

(я соединил их conversation_id, что они делают, посылая первое сообщение, и если кто-то ответить, первый он поиск conversation_id из сообщений, где он является приемник и парень, где он является ответом отправителя и посылающим сообщение с таким же conversation_id)

Теперь в списке сообщений я хочу выводить один только один последний ряд в другой conversation_id где sender_id='$my_id' OR receiver_id='$my_id'

Я использую DISTINCT, но я получаю все строки всегда в качестве вывода:

SELECT DISTINCT conversation_id, sender_id, message 
FROM messages 
WHERE receiver_id='$my_id' 
ORDER BY id DESC 
+1

Если вы хотите, рассмотрим следующие этой простой двухступенчатой ​​курс действий: 1. Если вы еще этого не сделали, предоставьте правильные инструкции CREATE и INSERT (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый результирующий набор, соответствующий информации, представленной на шаге 1. – Strawberry

+0

вы можете использовать LIMIT 1, если вы хотите, чтобы последняя 1 запись. – shubham715

+0

Просто 'LIMIT 1' bro. – peter

ответ

0

Пожалуйста, дайте следующий запрос попробовать:

SELECT 
M.* 
FROM messages M 
INNER JOIN 
(
    SELECT 
    MAX(id) AS last_id_of_conversation, 
    conversation_id 
    FROM messages 
    GROUP BY conversation_id 
) AS t 
ON M.id = last_id_of_conversation 

Объяснение:

SELECT 
MAX(id) AS last_id_of_conversation, 
conversation_id 
FROM messages 
GROUP BY conversation_id; 

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

Позже сделать внутреннее соединение между вашим главным столом (messages) и результат, возвращаемый внутреннего запроса на соответствие id. Я надеюсь, id is primary key. Если это так, то приведенный выше запрос гарантирует, что для каждой беседы будет выводиться одна строка (более конкретно строка, имеющая последнее сообщение).

EDIT:

SELECT 
M.* 
FROM messages M 
INNER JOIN 
(
    SELECT 
    MAX(id) AS last_id_of_conversation, 
    conversation_id 
    FROM messages 
    WHERE sender_id = ? OR receiver_id = ? 
    GROUP BY conversation_id 
) AS t 
ON M.id = last_id_of_conversation 
+0

Он работает, он меня разного разговора_ на один вывод и по последнему id из базы данных ....Но я попытался добавить WHERE receiver_id = '$ my_id' ИЛИ ​​sender_id = '$ my_id' И я получил 0, вы можете мне помочь здесь. – Skyey

+0

Да, я просто сделал то же самое, и он работает ..... Я очень смутно, потому что, как и год назад, я сделал чат таким же образом, и мой код просто выделил отдельный * из таблицы, где приемник равен my_id, и он работал, но теперь этого не произошло, и я никогда не использовал AS в mysql, поэтому он немного запутан, но AS говорит, что сохранить этот запрос как some_name правильно? и затем использовать это имя позже ... Правильно? Вы мне очень помогли, я делал это через 24 часа, постоянно пытаясь ... Хорошая работа – Skyey

+0

'AS' используется для присвоения имени псевдонимам. И это необязательно. Вы можете оставить слово 'AS', и это все равно. Просто используется для лучшей читаемости – 1000111

1

попробовать это

SELECT id,conversation_id, sender_id, receiver_id, message FROM message WHERE receiver_id='$my_id' GROUP BY `conversation_id` ORDER BY id DESC LIMIT 1 
+0

Я пробовал это, но по какой-то причине я не получаю последний идентификатор из базы данных – Skyey

+0

, есть ли ошибка или неправильная выборка данных по запросу. – shubham715

+0

Нет, он просто не выбирает max (id), почему я не знаю – Skyey

Смежные вопросы