2013-05-16 4 views
0

Я создаю систему обмена сообщениями, аналогичную facebook.Система обмена сообщениями mysql, список сообщений

У меня есть две таблицы:

messages => 
    m_id (message id) 
    t_id (thread id) 
    author_id (id of user that wrote the message) 
    text (Text for the message) 
    date (date) 
    time (time) 

thread_recipients => 
    t_id (thread_id) 
    user_id (id of the user that will belong to this thread) 
    read (Flag to tell if there are any unread messages) 

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

Я сделал sqlfiddle: http://sqlfiddle.com/#!2/a3d9b/2

Поэтому в основном я хочу, этот запрос возвращает только последнюю строку, так как она имеет самый высокий идентификатор сообщения.

Если это можно сделать без подзапроса, это было бы здорово. Если нет, то я буду просто жить с этим (:

EDIT:. я понял, как сделать это с подзапрос Но мой большой проблемой здесь является производительность, я бы очень хотел сделать. . это еще один способ, если это возможно

SELECT r.t_id, m.author_id, left(m.text, 50) 
FROM 
messages m, 
thread_recipients r 
WHERE 
r.user_id = 16 and 
r.t_id = m.t_id and 
m.m_id = (SELECT MAX(mm.m_id) FROM messages mm WHERE mm.t_id = m.t_id) 

ответ

0

Взгляните на это: http://www.techonthenet.com/sql/max.php Я думаю, что это то, что вам нужно

+0

Ну, я знаю о max, но моя проблема заключается в том, как его реализовать, желательно без подзапроса. – jah

0

Попробуйте

SELECT r.t_id, m.author_id, left(m.text, 50) 
FROM messages m, thread_recipients r 
WHERE 
r.user_id = 16 and r.t_id = m.t_id 
GROUP BY m.m_id 
ORDER BY m.m_id DESC 
LIMIT 1 
.

Я обновил ваш sqlfiddle

+0

Просто попробовал это и добавил пользователя 16 в поток 2 и удалил лимит. Это вернуло все 6 сообщений. Мне нужно выбрать все потоки, в которых пользователь находится, но получить только текст из последнего. Но мне нравится этот метод, но может ли он работать? – jah

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