t-alexashka
@t-alexashka
Сразу пишу legacy код

Как собрать контакт-лист из истории переписок?

Есть история переписки между юзерами на сайте (таблица im)

id, user_from, user_to, message, dt_created
-----
1, 1, 2, hello, date
2, 2, 1, hey, date
...

как мне из этого составить список контактов (диалогов) чтобы он был уникальный? если например я user_id = 1.

Я пробовал так:

SELECT * FROM im WHERE 
user_to = :user_id OR user_from = :user_id
GROUP BY user_to, user_from
ORDER BY dttm ASC


но на выводе я среди прочего вижу записи где мне писала alice, и я писал alice - как две разные записи контакт-листа. а должно быть просто запись alice, неважно кто из нас кому писал. как в телеграме (и в любом другом мессенджере).
  • Вопрос задан
  • 153 просмотра
Решения вопроса 2
@Aricus
Причина ясна, вы группируете по уникальным значениям как первого, так и второго столбца:
GROUP BY user_to, user_from

Если MIN и MAX работают со строками, то должно сработать такое:
GROUP BY MAX(user_to, user_from), MIN(user_to, user_from)

Другой вариант, через тернарный оператор:
GROUP BY if(user_to = :user_id, user_from, user_to)
Ответ написан
isset89
@isset89
Врёшь, тебе нравится
SELECT
i.ad_id,i.message, tmp.recipient,IFNULL(u.first_name, 'Без имени') AS recipient_name,tmp.date_last
FROM im i
INNER JOIN (
SELECT IF(user_to = 2, user_from, user_to) AS recipient, max(dttm) as date_last
FROM im
WHERE user_to = 2 OR user_from = 2
GROUP BY recipient
) AS tmp ON i.dttm = tmp.date_last
LEFT JOIN user u ON tmp.recipient = u.id

смотри на дату и время, здесь оно верно, и он должен выполниться быстрее, как заказывали:)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы