(My) SQL - для отображения последней папки входящих сообщений

0

Так что, надеюсь, вопрос не задан, но я его не нашел.

Таблица моего примера выглядит так: https://imgur.com/a/BBykp

Для моего SQL я знаю, например, идентификатор пользователя 1, и я хочу показать папку "Входящие" моего Messenger, для чего мне нужно знать, получил ли идентификатор пользователя 1 сообщение или был отправителем сообщения.

Например:

sender_id receiver_id
  1         2
  3         1
  1         4
 12         1

Должен дать мне четыре результата Inbox для ID 1.

Поэтому я в настоящее время

SELECT * FROM chats AS tm 
WHERE tm.id IN
(SELECT MAX(id) FROM chats WHERE sender_id = 1 OR receiver_id = 1 GROUP BY receiver_id)

Это получает меня: https://imgur.com/a/P665T

Вы увидите, что мне не нужен ID 2, но мне нужен ID 3, потому что это последнее сообщение этого разговора.

Итак, как я могу решить с SQL, что мне нужен последний из sender_id 1 или receiver_id 1?

Спасибо!

Теги:

2 ответа

1
Лучший ответ

Один из вариантов использует наименьший/самый большой трюк:

SELECT t1.*
FROM chats t1
INNER JOIN
(
    SELECT
        LEAST(sender_id, receiver_id) AS sender_id,
        GREATEST(sender_id, receiver_id) AS receiver_id,
        MAX(updated_at) AS max_updated_at
    FROM chats
    GROUP BY
        LEAST(sender_id, receiver_id),
        GREATEST(sender_id, receiver_id)
) t2
    ON LEAST(t1.sender_id, t1.receiver_id) = t2.sender_id AND
       GREATEST(t1.sender_id, t1.receiver_id) = t2.receiver_id AND
       t1.updated_at = t2.max_updated_at;

Изображение 174551

демонстрация

  • 0
    Ух ты! Теперь я должен проверить, что он на самом деле делает, но он прекрасно работает, когда я добавляю в последнюю строку: ГДЕ t1.sender_id = 1 ИЛИ t1.receiver_id = 1
0

SELECT * FROM chats AS tm WHERE tm.id IN (SELECT MAX (id) FROM chats WHERE sender_id = 1 ИЛИ receiver_id = 1 GROUP BY receiver_id)

Вы можете попробовать с Top (1), как это

SELECT id FROM chats WHERE sender_id = 1 ИЛИ receiver_id = 1 ORDER BY ID DESC
ПРЕДЕЛ 1

Это последняя строка в чатах, где есть отправитель или ресивер с идентификатором 1

Является первым аппроксимацией (это субоптимально)

  • 0
    Похоже на код SQL Server? OP использует MySQL.
  • 0
    Ты прав. Я не помню, у mysl есть LIMIT

Ещё вопросы

Сообщество Overcoder
Наверх
Меню