SQL-запрос для получения сообщений пользователей в порядке последнего сообщения

У меня есть SQL-запрос, который выбирает пользователей из моей таблицы пользователей, которые отправили сообщение или получили сообщение от моего выбранного пользователя (идентификатор отправителя или получатель в таблице сообщений).

Запрос такой:

SELECT * 
FROM users 
WHERE (ID IN (SELECT DISTINCT(senderID) 
              FROM messages 
              WHERE recipientID = $userID) 
       OR ID IN (SELECT DISTINCT(recipientID) 
                 FROM messages 
                 WHERE senderID = $userID))

Учитывая, что столбец sentAt является меткой времени сообщения, как я могу заказать возврат в том порядке, в котором пользователь отправил самое последнее сообщение. Я попытался добавить ORDER BY sentAt DESC к подзапросам, но он не дал ожидаемого результата.

Любая помощь будет принята с благодарностью.

Для какой СУБД это нужно? Добавьте тег, чтобы указать, используете ли вы mysql, postgresql, sql-server, oracle или db2 - или что-то еще.

marc_s 22.04.2018 21:15

Пожалуйста, предоставьте образцы данных и желаемые результаты.

Gordon Linoff 22.04.2018 21:17

Извините, я отредактировал теги, чтобы отразить, что это mysql.

James Buckland 22.04.2018 21:40
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
3
167
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, вам нужен join вместо in:

select u.*
from users u join
     messages m
     on u.id in (m.senderid, m.recipientid)
where u.id = $userid
order by m.sentat desc

Я искал JOIN, ваш ответ немного отличался от того, что мне было нужно, поскольку он вернул только пользователя, которого я искал, сообщения, связанные, но с некоторыми небольшими настройками он работал отлично. Если кому-то интересно, мой окончательный код выглядел следующим образом: SELECT * FROM users AS u INNER JOIN messages AS m ON u.ID IN (m.senderID, m.recipientID) WHERE u.ID <> $userID GROUP BY u.ID ORDER BY m.sentAt DESC

James Buckland 22.04.2018 21:37

Другие вопросы по теме