Получить строку последнего разговора из таблицы базы данных MySQL - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть база данных на MYSQL, и у нее есть таблица чата, которая выглядит следующим образом.

enter image description here

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

SELECT * FROM (
    SELECT * FROM `user_chats`
    WHERE sender_id =2 OR receiver_id =2
    ORDER BY id DESC
) AS tbl
GROUP BY sender_id, receiver_id 

Но мое требование - только 5,4 ID записи. в основном, мое требование идентифицирует выборку последнего разговора между 2 пользователями. Здесь между 2 и 3 разговорами пользователей есть 2 записи, и мы хотим, чтобы только одна из них, т.е. id = 5, здесь не нужна id = 2.

Так, как мы можем написать запрос для этого результата?

Ответы [ 3 ]

2 голосов
/ 08 декабря 2011

Следующее дает вам последняя запись (при условии, что чем больше id, тем позже он был создан) соответствует вашим критериям :

SELECT * FROM `user_chats`
WHERE (`sender_id` =2 AND `receiver_id` =3) OR (`sender_id` =3 AND `receiver_id` =2)
ORDER BY `id` DESC
LIMIT 1

, что было бы неплохо, если бы id был первичным ключом, и он повышался вместе с ростом значения created. В противном случае (если вы не уверены, что id повышается при created повышении), замените строку ORDER BY следующим:

ORDER BY `created` DESC

Кроме того, в обоих случаях ставит правильные индексы в: id (если это ваш первичный ключ, тогда нет необходимости добавлять в него дополнительный индекс), sender_id и receiver_id (предпочтительно составной индекс, то есть единый индекс для обоих столбцов), created (если вы хотите использовать ORDER BY created DESC вместо ORDER BY id DESC - в противном случае в этом нет необходимости).

2 голосов
/ 08 декабря 2011
SELECT 
 * 
FROM 
 user_chats uc 
WHERE
 not exists ( 
   SELECT 
    1 
   FROM 
     user_chats uc2 
   WHERE 
     uc2.created > uc.created AND 
     (
       (uc.sender_id = uc2.sender_id AND uc.reciever_id = uc2.reciever_id) OR  
       (uc.sender_id = uc2.reciever_id AND uc.reciever_id = uc2.sender_id)
     )
  )
0 голосов
/ 08 декабря 2011

попробуй GROUP BY LEAST(sender_id, receiver_id), GREATEST(sender_id, receiver_id)

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