У меня проблема с моим SQL-запросом. Я хочу отобразить последнее сообщение для пользователя. Таким образом, я использую метод "GROUP BY", но он не отображает сообщение LAST.
Это мой первый запрос:
SELECT 'messages'.*, 'conversations'.*
FROM 'messages' JOIN 'conversations' ON 'conversations'.'cNUM' = 'messages'.'mCONV_NUM'
WHERE 'cUSER2' = '2'
GROUP BY 'messages'.'mCONV_NUMn'
Я стараюсь следовать этому вопросу: ORDER BY date и time ПЕРЕД НАЗНАЧЕНИЕМ GROUP BY в mysql (и многом другом)
И у меня есть это:
SELECT 'messages'.*, 'conversations'.*
FROM (SELECT mTIME
FROM 'messages'
ORDER BY mTIME desc) AS M
JOIN 'conversations' ON 'conversations'.'cNUM' = 'messages'.'mCONV_NUM'
WHERE 'cUSER2' = '2'
GROUP BY 'messages'.'mCONV_NUMn'
И у меня есть эта ошибка: "Сообщения" сообщений неизвестны.
Так что.. мне нужна твоя помощь
Вы говорите, что хотите получить последнее сообщение для пользователя, но, похоже, вам действительно нужны несколько сообщений, а именно их последнее сообщение о каждом разговоре, в котором они принимали участие.
Из-за отсутствия функций CROSS APPLY
и окон в MySQL вам нужен запрос, который выполняет множество поисков, чтобы получить последнее сообщение за разговор:
select *
from conversations c
join messages m on m.mconv_num = c.cnum
where c.cuser2 = 2
and not exists
(
select *
from messages m2
where m2.mconv_num = m.mconv_num
and m2.mtime > m.mtime
);
Я хочу отобразить последнее сообщение для пользователя.
Вы получите последнее сообщение для пользователя с LIMIT
:
select *
from conversations c
join messages m on m.mconv_num = c.cnum
where c.cuser2 = 2
order by m.mtime
limit 1;
Вы дали псевдоним M вашей таблице сообщений, поскольку isaace сказал, что вы будете называть его как "M" в остальной части запроса, так как это временное имя длится всю продолжительность запроса, а FROM - начальный этап обработки запроса,
Мы говорим о чем-то, что называется обработкой логических запросов, это означает, что в вашем запросе запроса FROM вычисляется и обрабатывается первоначально, а затем остальная часть запроса.
В условиях LQP запросы будут обрабатываться в следующем порядке.
(Конечно, я забыл некоторые этапы, но вы поняли)
Также вы можете использовать LIMIT для получения последнего сообщения для пользователя. Просто добавьте LIMIT 1 в конце.
ORDER BY
имеет смысла. Какая у вас СУБД? Обычно это решается с помощью оконных функций илиCROSS APPLY
. Из уродливых галочек я беру это MySQL? MySQL не поддерживает ни один из методов.