Возвращает максимальное значение половины составного ключа MYSQL - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь запросить таблицу, в которой есть составной ключ, состоящий из двух целых чисел. Отношение: enter image description here

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

SELECT c.conversation_id 
FROM conversation as c
INNER JOIN (
SELECT MAX(threadNum), user_from, user_to, message, dateTime, deleted,replied
FROM messages
GROUP BY conversation_id
) as m ON c.conversation_id = m.conversation_Id
WHERE (m.user_to ='$userId' OR m.user_from ='$userId') AND m.deleted = 0 

Результаты, которые я ожидаю для диалога_Id и threadNum, будут: 35 5 34 4 33 55

один результат для каждого диалога_Id и только самого большого threadNum результат. В настоящее время я получаю неизвестный столбец m.converation_Id. Что не так со структурой запроса? И что еще более важно, есть ли более простой способ сделать то, что я пытаюсь сделать?

1 Ответ

0 голосов
/ 09 мая 2020

Похоже, вам нужна одна строка для каждого разговора вместе с последним сообщением в разговоре (то есть сообщением, которое имеет наибольшее thread_id).

Если да, это первое -групповая проблема. Вы можете решить эту проблему путем фильтрации с помощью коррелированного подзапроса:

select c.*, m.*
from conversation c
inner join messages m on m.conversation_id = c.conversation_id
where m.thread_num = (
    select max(m1.thread_num)
    from messages m1
    where 
        m1.conversation_id = m.conversation_id
        and m.deleted = 0
        and :user_id in (m.user_from, m.user_to)
)

:user_id представляет параметр запроса для вашего запроса (вы должны использовать параметризованный запрос вместо того, чтобы вводить переменную в строку запроса).

В качестве альтернативы, если вы используете MySQL 8.0, вы можете использовать row_number():

select *
from (
    select 
        c.*, 
        m.*, 
        row_number() over(partition by c.conversation order by m.thread_num desc) rn
    from conversation c
    inner join messages m on m.conversation_id = c.conversation_id
    where m.deleted = 0 and :user_id in (m.user_from, m.user_to)
) t
where rn = 1
...