ЗАКАЗАТЬ до GROUP BY с РЕШЕНИЕМ

0

У меня проблема с моим 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'

И у меня есть эта ошибка: "Сообщения" сообщений неизвестны.

Так что.. мне нужна твоя помощь

  • 5
    Во втором запросе вы дали сообщениям псевдоним M, поэтому вам следует называть его M вместо сообщений.
  • 0
    В любом случае, строки в таблице (включая производные таблицы, то есть подзапросы) считаются неупорядоченными. Так что ваш ORDER BY имеет смысла. Какая у вас СУБД? Обычно это решается с помощью оконных функций или CROSS APPLY . Из уродливых галочек я беру это MySQL? MySQL не поддерживает ни один из методов.
Теги:
sql-order-by

3 ответа

0
Лучший ответ

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

Из-за отсутствия функций 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
);
0

Я хочу отобразить последнее сообщение для пользователя.

Вы получите последнее сообщение для пользователя с LIMIT:

select *
from conversations c 
join messages m on m.mconv_num = c.cnum
where c.cuser2 = 2
order by m.mtime
limit 1;
  • 0
    Здравствуй. Спасибо за ваш ответ. Я хочу последнее сообщение из всех разговоров, где пользователь "user2". Не только один
  • 0
    Тогда посмотри мой другой ответ.
0

Вы дали псевдоним M вашей таблице сообщений, поскольку isaace сказал, что вы будете называть его как "M" в остальной части запроса, так как это временное имя длится всю продолжительность запроса, а FROM - начальный этап обработки запроса,

Мы говорим о чем-то, что называется обработкой логических запросов, это означает, что в вашем запросе запроса FROM вычисляется и обрабатывается первоначально, а затем остальная часть запроса.


В условиях LQP запросы будут обрабатываться в следующем порядке.

  • FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY

(Конечно, я забыл некоторые этапы, но вы поняли)

Также вы можете использовать LIMIT для получения последнего сообщения для пользователя. Просто добавьте LIMIT 1 в конце.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню