=> Я хочу получить последнюю запись для преобразования чата между двумя пользователями на основе созданного поля даты для получения последнего сообщения. ниже моя таблица
Я пробовал этот запрос для получения результата последнего сообщения о преобразовании чата, но я не могу получить правильный результат.
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
=> Текущий результат: -
=> Должно быть: -
Примечание:- Эта функция аналогична функции чата, и я не хочу получать только одну запись.
Спасибо.
@MaulikShah да, я уже пробовал короткие данные в порядке убывания.






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.
Спасибо за ваши усилия. Пожалуйста, проверьте, я отредактировал свой вопрос.
Почему вы группируете по 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`;
Пожалуйста, проверьте мое новое решение.
Спасибо за ваши усилия, но это не должно работать для меня. +1
Если вы сгруппируете по 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» с идентификатором.
Как насчет сейчас ?
Я получаю 2 записи с неправильным сообщением и неправильным идентификатором, когда я удаляю ограничение из вашего запроса. поэтому, пожалуйста, проверьте мою вышеуказанную базу данных и обновленный вопрос. что я должен
вопрос, как мы получаем неправильное сообщение и идентификатор, когда они находятся в одной строке? мы не присоединяемся к столам и т. д. Я убираю ограничение, я думаю, это должно сработать.. если нет, то какой результат вы получаете, можете ли вы опубликовать его?
Спасибо за ваши усилия, но это не должно работать для меня. +1
да, это идея, почему это не работает, так что я могу помочь вам, если вы все еще хотите помочь.
Давайте продолжить обсуждение в чате.
Я предполагаю, что у вас есть модель сообщений (вы используете laravel)
Ниже запрос должен дать вам то, что вы хотите.
Message::whereSenderIdAndClientId($userId1,$userId2)
->orWhere([
["sender_id", $userId2],
["client_id",$userId1]
])
->orderBy("created_at","desc")
->first()
Получайте сообщения между отправителем и клиентом, упорядочивайте сообщения с помощью created_at - desc, затем берите первое сообщение, которое является последним сообщением между собой.
получить данные в порядке убывания