SQL / Laravel: возможно ли вернуть дедуплицированные результаты на основе двух значений столбца?

У меня довольно стандартная модель чата, которая содержит сообщения. Для простоты, скажем, у него есть три столбца: to_user_id, from_user_id а также message,

Я хочу вернуть дедуплицированные результаты на основе двух значений столбца: to_user_id а также from_user_id, Это я могу перечислить текущие разговоры. Я могу вернуть возвращенный дедуплицированный набор результатов, используя одно значение столбца. Тем не менее, это важно, как показано ниже. Очевидно, это потому, что пользователь может быть одновременно to_user_id а также from_user_id в зависимости от того, отправили или получили сообщение.

Том> Гарри
Гарри> Том
Джон> Крис
Крис> Джон

Я надеюсь получить что-то вроде ниже, так что это groupBy

Том> Гарри
Джон> Крис

Разговоры ведутся один на один, поэтому когда-либо будет только два участника.

Любая помощь будет принята с благодарностью!

1

Решение

Это может сработать:

SELECT DISTINCT
if(to_user_id > from_user_id,to_user_id ,from_user_id) as source,
if(to_user_id > from_user_id,from_user_id,to_user_id ) as target
FROM conversations;

Вероятно, не подходит, чтобы быть частью чего-то более сложного.

1

Другие решения

Не лучшее решение, но я полагаю, оно должно работать. Так что идея в сортировке по user_id, так что вы получите уникальные пары разговоров.

Select if(to_user_id > from_user_id, concat(from_user_id, ':', to_user_id), concat(to_user_id, ':', from_user_id)) as pair from messages group by pair;
1

Мне удалось объединить это с данными из users Таблица с приведенным ниже решением. Мысль я бы поделился.

Select O.Sender, S.First_Name, S.Last_Name, O.Target, T.First_Name,
T.LastName
From (
SELECT DISTINCT
if(to_user_id > from_user_id, to_user_id, from_user_id) as sender,
if(to_user_id > from_user_id, from_user_id, to_user_id ) as target
FROM chats AS pair
) O
LEFT JOIN Users S ON O.Sender = S.UserID
LEFT JOIN Users T ON O.Target = T.UserID
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector