MySQL - Выбрать последние строки столбца LEFT JOIN на основе полей - PullRequest
1 голос
/ 22 апреля 2020

Я создаю мобильное веб-приложение для чата и застрял в проблеме. Переходя прямо к вопросу, у меня есть экран, который отображает список сообщений от всех пользователей (например, WhatsApp). Я хочу отобразить последнее сообщение, отправленное или полученное между пользователями в списке (как на скриншоте ниже). Мой текущий запрос извлекает сообщение из 1-й строки для всех пользователей прямо сейчас. Это не то, что я хочу.

Немного более краткой информации о происходящем

Как видно из таблицы messages, поля msg_from и msg_to представляют отправителя и получатель соответственно. В моих данных сообщения передаются между пользователем 1 & 8 и пользователем 1 & 11. Для пользователя 1 & 8 последней выбранной записью должна быть запись 9, которая имеет msg_message Are you there? и аналогично, для пользователя 1 & 11 последняя запись для извлечения будет запись 10, которая имеет msg_message Would you like to join?. Но в настоящее время для всех пользователей извлекаемая запись является первой записью с сообщением How are you?. Какие изменения должен иметь мой запрос, чтобы получить желаемый результат? Пожалуйста, посмотрите на скрипку ниже.

Скрипка Здесь: Скрипка DB

WhatsApp Screenshot

1 Ответ

1 голос
/ 22 апреля 2020

Я многому научился из исследований, чтобы решить эту проблему. При группировании groupBy возьмет первый ряд несгруппированных столбцов (suck as msg_message), поэтому мы можем упорядочить его при объединении с помощью подзапроса, так:

SELECT swp_by, swp_to, msg_from, msg_to, mem_fname, mem_lname, mem_last_activity, msg_message, GREATEST(MAX(msg_time), swipes.swp_date) as msgdate, COUNT(msg_id) as msgcnt FROM swipes

LEFT JOIN 
(
  SELECT * FROM messages order by msg_time desc  -- this is the magic, we use this subquery to order before grouping       
) 
messages ON 
((
     messages.msg_from = swipes.swp_by 
     AND messages.msg_to = swipes.swp_to) 
     OR (messages.msg_from = swipes.swp_to 
     AND messages.msg_to = swipes.swp_by
))

решение находится в ваша скрипка: https://www.db-fiddle.com/f/xnh4jiUb8rDLFHpL2gWHrM/5

enter image description here

Мне кажется, я получил ожидаемый результат

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