Как я могу получить последнюю запись для преобразования чата между двумя пользователями?

=> Я хочу получить последнюю запись для преобразования чата между двумя пользователями на основе созданного поля даты для получения последнего сообщения. ниже моя таблица

Как я могу получить последнюю запись для преобразования чата между двумя пользователями?

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

select `chat_messages`.`id`, `chat_messages`.`message`, `chat_messages`.`created_at` 
from `chat_messages`
where `chat_messages`.`is_group` = 0 
and `chat_messages`.`deleted_at` is null 
and (`sender_id` =141 or `client_id` = 141)
group by `chat_messages`.`message_token` 
order by `chat_messages`.`created_at` desc

=> Текущий результат: -

Как я могу получить последнюю запись для преобразования чата между двумя пользователями?

=> Должно быть: -

Как я могу получить последнюю запись для преобразования чата между двумя пользователями?

Примечание:- Эта функция аналогична функции чата, и я не хочу получать только одну запись.

Спасибо.

получить данные в порядке убывания

Maulik Shah 22.02.2019 13:14

@MaulikShah да, я уже пробовал короткие данные в порядке убывания.

Nimesh Patel 22.02.2019 13:22
Освоение архитектуры микросервисов с 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
2
119
4

Ответы 4

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

select `chat_messages`.`id`, `chat_messages`.`message`, `chat_messages`.`created_at` 
from `chat_messages`
where `chat_messages`.`is_group` = 0 
and `chat_messages`.`deleted_at` is null 
and (`sender_id` =141 or `client_id` = 141)
order by `chat_messages`.`created_at` desc
LIMIT 1

если использовать ограничение, это даст только одну правильную запись, но для этого вопроса я хочу получить всю последнюю запись для всего разговора, где sender_id равен 141.

Nimesh Patel 22.02.2019 13:27

Спасибо за ваши усилия. Пожалуйста, проверьте, я отредактировал свой вопрос.

Nimesh Patel 22.02.2019 13:37

Почему вы группируете по message_token?

Я думаю, что этот запрос будет действительным:

select `chat_messages`.`id`, `chat_messages`.`message`, `chat_messages`.`created_at` 
from `chat_messages`
where `chat_messages`.`message_token` = '144_141'
and `chat_messages`.`is_group` = 0 
and `chat_messages`.`deleted_at` is null 
order by `chat_messages`.`created_at` desc
limit 1

После вашего редактирования:


select `chat_messages`.`id`, `chat_messages`.`message`, `chat_messages`.`created_at`
from (select * from `chat_messages` order by `chat_messages`.`created_at` desc) as chat_messages
where `chat_messages`.`is_group` = 0
and `chat_messages`.`deleted_at` is null
and (`sender_id` =141 or `client_id` = 141)
group by `chat_messages`.`message_token`;

Пожалуйста, проверьте мое новое решение.

Jose Luis Poveda 22.02.2019 14:10

Спасибо за ваши усилия, но это не должно работать для меня. +1

Nimesh Patel 22.02.2019 14:16

Если вы сгруппируете по message_token, вы присоединитесь ко всем этим сообщениям, вам нужно будет выбрать этот поток сообщений в выражении where, где message_token = XXX.

SELECT 
    `chat_messages`.`id`, 
    `chat_messages`.`message`, 
    `chat_messages`.`created_at` 
FROM 
    `chat_messages`
WHERE 
    `chat_messages`.`is_group` = 0 
    and `chat_messages`.`deleted_at` is null 
    and (`sender_id` =141 or `client_id` = 141)
    and `chat_messages`.`message_token`= "146_141"
ORDER BY 
    `chat_messages`.`created_at` desc, 
    `chat_messages`.`id` desc

это даст только одну запись с идентификатором «7». пожалуйста, проверьте мой вопрос и указанную выше базу данных, а также то, что я должен получить номер записи «5» и «7» с идентификатором.

Nimesh Patel 22.02.2019 13:47

Как насчет сейчас ?

Vidal 22.02.2019 13:53

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

Nimesh Patel 22.02.2019 13:58

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

Vidal 22.02.2019 14:08

Спасибо за ваши усилия, но это не должно работать для меня. +1

Nimesh Patel 22.02.2019 14:15

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

Vidal 22.02.2019 14:16

Давайте продолжить обсуждение в чате.

Nimesh Patel 22.02.2019 14:17

Я предполагаю, что у вас есть модель сообщений (вы используете laravel)

Ниже запрос должен дать вам то, что вы хотите.

Message::whereSenderIdAndClientId($userId1,$userId2)
       ->orWhere([
             ["sender_id", $userId2],
             ["client_id",$userId1] 
         ])
       ->orderBy("created_at","desc")
       ->first()

Получайте сообщения между отправителем и клиентом, упорядочивайте сообщения с помощью created_at - desc, затем берите первое сообщение, которое является последним сообщением между собой.

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