Получайте максимальные значения с помощью внутреннего соединения и максимального 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)