2017-01-10 6 views
0

Я пытаюсь получить последнее сообщение из определенного потока, но, похоже, не может получить правильный запрос. Кажется, я не получаю последнее сообщение из определенного потока.MySQL получить последнее сообщение (VarChar)

Введение

Я использую 3 таблицы - сообщение, message_users, message_threads

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

Структура базы данных

messages table 
    id | t_id | u_id | message | time 
--------+---------+--------+-----------+-------- 
     1 | 1 | 1 | hello! | timestamp 
     2 | 1 | 2 | hi!  | timestamp 
     3 | 2 | 1 | testing | timestamp 


message_threads 
    id | author | subject 
------+---------+----------- 
    1 | 1 | Subject 1 
    2 | 3 | Subject 2 
    3 | 2 | Subject 3 


message_users 
    id | t_id | u_id | read | nonotice 
------+---------+--------+--------+---------- 
    1 | 1 | 1 | 0 | 0 
    2 | 1 | 2 | 0 | 0 
    3 | 2 | 1 | 1 | 0 

Запрос

Это запрос, я использую, это почти работает за исключением того, не получает последний идентификатор, ни последнего сообщения, любой идеи? (Да, я смотрел и искал предыдущие вопросы, задаваемые по этому вопросу, но не было в состоянии получить запрос фиксированный на основе ответов как-то)

SELECT 
    m2.message, 
    mt.id AS thread_id, 
    max(m.id) AS message_id, 
    max(m.time) AS time, 
    mt.subject 
FROM message_users AS mu 
LEFT JOIN message_threads AS mt ON mt.id = mu.t_id 
LEFT JOIN message AS m ON m.t_id = mt.id 
INNER JOIN (
    select message as messages_text 
    from message group by t_id 
) AS m2 ON m2.id = m.id 
WHERE mu.u_id = 1 AND mu.read = 0 AND mu.nonotice = 0 
GROUP BY mt.id 
ORDER BY m.id DESC 

ответ

1
SELECT 
    m.t_id, 
    m.message, 
    m.id AS max_message_id, 
    m.ts AS max_message_ts, 
    t.subject 
FROM messages AS m 
JOIN message_threads AS t ON m.t_id = t.id 
JOIN (
    SELECT t_id, max(id) max_id FROM messages GROUP BY 1 
) AS m2 ON m.id = m2.max_id 
JOIN message_users AS u ON u.t_id = t.id AND u.u_id = 1 AND u.`read` = 0 AND u.nonotice = 0 

Если выше SQL становится медленной, вам может сделать одно из следующих действий:

1 - добавить где во внутреннем присоединиться SQL, чтобы сделать этот результат меньше, что:

SELECT 
    m.t_id, 
    m.message, 
    m.id AS max_message_id, 
    m.ts AS max_message_ts, 
    m2.subject 
FROM messages AS m 
JOIN (
    SELECT t.id, max(m.id) AS max_id, t.subject 
    FROM messages AS m 
    JOIN message_threads AS t ON m.t_id = t.id 
    JOIN message_users AS u ON u.t_id = t.id 
    AND u.u_id = 1 AND u.`read` = 0 AND u.nonotice = 0 
    GROUP BY 1 
) AS m2 ON m.id = m2.max_id 

2 - редизайн message_thread добавить вычисляемое сотрудничество lumns: (last_message_id, last_updated) и т.д.

PS - попытаться избежать MySQL ключевых слов в именах столбцов

enter image description here

+0

Спасибо, я попробую это наш момент я получаю домой, я буду обновлять, если оно работает. Просто обновил вопрос с дополнительной информацией о таблице. – user2949138

+0

Удивительно, это работает! Пошел со вторичным решением, так как первая эна дала результат 0,05 секунды, а другая 0,0009, также спасибо за предложение, когда речь заходит об условных обозначениях :) – user2949138

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