Получить несколько записей из нескольких баз данных с помощью одного запроса

У меня есть две таблицы следующим образом: -

Пользователи (таблица 1)

id name email     passs
1  u1   uemail1   pass1
2  u2   uemail2   pass2
3  u3   uemail3   pass3
4  u4   uemail4   pass4

Сообщения (Таблица 2)

mess_id sender receiver message_text  send_time
1        1     2        text1         2019-03-25 09:39:05
2        1     2        text2         2019-03-30 15:10:54  
3        1     3        text3         2019-03-30 15:11:59
4        1     4        text4         2019-03-30 15:12:48
5        1     4        text5         2019-03-30 15:13:53
6        4     1        text6         2019-04-09 09:26:53

Вошедший в систему пользователь - u1, и я хочу получить последний разговор, который является 6-м, все в порядке.

Теперь я хочу найти последний разговор u1 и с кем, а затем найти подробности из таблицы пользователей другого пользователя, с которым у u1 был последний разговор

Я надеюсь, что вы получили мой вопрос, и это ясно для всех.

Как я могу сделать все это 1 запрос

Результатом будет информация о другом пользователе, как в приведенном выше случае, пользователь будет u4

id name email     passs
4  u4   uemail4   pass4

До сих пор я пробовал это, но не получил результат, который хотел

select name from users where id=(select receiver_id,sender_id from messages where receiver_id or sender_id=1 order by send_time desc limit 1)

Каким должен быть ожидаемый результат в табличном формате?

Madhur Bhaiya 09.04.2019 15:46

на выходе будут данные пользователя, такие как имя и т. д.

donm 09.04.2019 15:47

Добавьте ожидаемый результат в табличном формате к вопросу. Точно так же, как вы указали структуру (ы) таблицы.

Madhur Bhaiya 09.04.2019 15:48

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

Dave 09.04.2019 15:50

@MadhurBhaiya, пожалуйста, проверьте вопрос еще раз, я добавил результат, который хотел

donm 09.04.2019 15:52

@Dave, пожалуйста, проверьте вопрос еще раз, я добавил то, что пробовал до сих пор

donm 09.04.2019 16:01

Любая помощь будет оценена?

donm 09.04.2019 16:16
Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
7
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Один из способов — определить другой идентификатор пользователя в производной таблице, а затем присоединить его к пользовательской таблице, чтобы получить сведения о пользователе.

SELECT 
  u.* 
FROM 
  user AS u 
JOIN 
(
  SELECT
    IF(sender <> 1, sender, receiver) AS other_user  /*Logged-in User Id is mentioned here */
  FROM messages 
  WHERE sender = 1 OR receiver = 1  /*Logged-in User Id is mentioned here */
  ORDER BY send_time DESC LIMIT 1   /*Get the latest message row */
) AS dt ON dt.other_user = u.id

IF(sender <> 1, sender, receiver) определяет другой идентификатор пользователя. Если sender не 1 (зарегистрированный пользователь), то мы рассматриваем sender как другого пользователя, иначе receiver. Это основано на (в основном правильном) предположении, что sender и receiver всегда будут разными значениями.

Большое спасибо, Мадхур, мне нужно условие if в моем запросе, и тогда я получу то, что хотел.

donm 09.04.2019 16:28

Вот несколько сложный, но очень общий способ решения проблемы. Он находит максимальное время отправки/получения для каждого пользователя в производной таблице, затем JOIN отправляет его в messages таблицу, чтобы найти другого пользователя, связанного с этим сообщением, а затем JOIN отправляет это снова в users таблицу, чтобы найти данные этого пользователя. Интересующий пользователь указывается в предложении WHERE в конце запроса.

SELECT u2.*
FROM users u1
JOIN (SELECT user, MAX(send_time) AS send_time
      FROM (SELECT sender AS user, MAX(send_time) AS send_time
            FROM messages
            GROUP BY sender
            UNION
            SELECT receiver, MAX(send_time)
            FROM messages
            GROUP BY receiver) mt
      GROUP BY user) mt ON mt.user = u1.id
LEFT JOIN messages m1 ON m1.sender = mt.user AND m1.send_time = mt.send_time
LEFT JOIN messages m2 ON m2.receiver = mt.user AND m2.send_time = mt.send_time
JOIN users u2 ON u2.id = COALESCE(m1.receiver, m2.sender)
WHERE u1.id = 1

Выход:

id  name    email   passs
4   u4      uemail4 pass4

Демо на dbfiddle

Спасибо, Ник, за ответ, но я получил свое решение от ответа Мадхура.

donm 09.04.2019 16:29

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