Получайте максимальные значения с помощью внутреннего соединения и максимального id
У меня есть две таблицы, беседы и сообщения,
То, что я хотел бы сделать, - сделать внутреннее соединение от разговоров к сообщениям.
Вот мой запрос:
SELECT
messages.msg,
messages.`read`,
conversations.userid,
conversations.contactid
FROM conversations
INNER JOIN messages ON
conversations.id = messages.convId
WHERE conversations.id IN(443,444)
Теперь все работает так, как должно, но последнее, что происходит во внутреннем соединении, где я использую
conversations.id = messages.convId
Я хотел бы получить только самые высокие идентификаторы, например:
AND MAX(messages.id)
Но это не работает
EDIT:
Я попытался использовать:
LEFT JOIN messages
ON conversations.id = messages.convId
AND messages.id = MAX(messages.id)
Но я получил сообщение об ошибке: Недопустимое использование групповой функции.
Ответы
Ответ 1
ИЗМЕНИТЬ
Это будет работать!
SELECT conversations.*, m1.*
FROM conversations
LEFT JOIN messages m1
ON conversations.id = m1.cid
AND m1.id = (
SELECT MAX(m2.id)
FROM messages m2
WHERE m2.cid = conversations.id
)
Ответ 2
Вы ищете максимальное значение в группе. У MySQL нет действительно очевидного способа сделать это (много способов с небольшим количеством обмана).
Но вы ищете только две группы. Таким образом, вы можете просто найти ограничение в каждой группе и объединить их с помощью union all
:
SELECT m.msg, m.`read`, c.userid,
c.contactid
FROM conversations c inner join
((select m.*
from messages m
where m.convid = 443
order by m.id desc
limit 1
) union all
(select m.*
from messages m
where m.convid = 444
order by m.id desc
limit 1
)
) m
ON c.id = m.convId;
Если у вас есть индексы на messages(convid, id)
и conversations(id)
, это должно быть довольно быстро.
Вы также можете сделать это, используя более стандартный подход:
SELECT m.msg, m.`read`, c.userid,
c.contactid
FROM conversations c inner join
messages m
ON c.id = m.convId
where c.convId in (443, 444) and
m.id = (select max(id) from messages m2 where m2.convId = c.convId)