Так что, надеюсь, вопрос не задан, но я его не нашел.
Таблица моего примера выглядит так: 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?
Спасибо!
Один из вариантов использует наименьший/самый большой трюк:
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;
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
Является первым аппроксимацией (это субоптимально)