MySQL получает последнее сообщение (VarChar)

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

Вступление

Я использую 3 таблицы — message, 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  | timestampmessage_threads
id |  author |  subject
------+---------+-----------
1 |    1    | Subject 1
2 |    3    | Subject 2
3 |    2    | Subject 3message_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

0

Решение

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, добавить вычисляемые столбцы: (last_message_id, last_updated) и т. Д.

PS — старайтесь избегать ключевых слов MySQL в качестве имен столбцов

введите описание изображения здесь

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]