У меня есть две таблицы следующим образом: -
Пользователи (таблица 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)
на выходе будут данные пользователя, такие как имя и т. д.
Добавьте ожидаемый результат в табличном формате к вопросу. Точно так же, как вы указали структуру (ы) таблицы.
Пожалуйста, редактировать свой вопрос и укажите, что вы пробовали, но не дает нужного вам результата.
@MadhurBhaiya, пожалуйста, проверьте вопрос еще раз, я добавил результат, который хотел
@Dave, пожалуйста, проверьте вопрос еще раз, я добавил то, что пробовал до сих пор
Любая помощь будет оценена?
Один из способов — определить другой идентификатор пользователя в производной таблице, а затем присоединить его к пользовательской таблице, чтобы получить сведения о пользователе.
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 в моем запросе, и тогда я получу то, что хотел.
Вот несколько сложный, но очень общий способ решения проблемы. Он находит максимальное время отправки/получения для каждого пользователя в производной таблице, затем 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
Спасибо, Ник, за ответ, но я получил свое решение от ответа Мадхура.
Каким должен быть ожидаемый результат в табличном формате?