Как вывести список уникальных сочетаний двух полей из одной таблицы mysql?

Всем доброго времени суток!

Уже два дня бьюсь - не могу решить задачу.

Условие: есть таблица в mysql, в которой хранятся все записи чата. Соответственно, не считая поля id, есть поля: fromid, toid, text,data. Необходимо вывести все УНИКАЛЬНЫЕ пары полей fromid и toid (то есть, все возможные диалоги пользователей) с сортировкой по дате(поле data), при этом, получается, что важно именно сочетание, к примеру, набор чисел (fromid=22, toid=25) равен (toid=25, fromid=22) и - соответствено, остается первый встретившийся при выборке набор.

Думаю, что это возможно решить через массивы php, но всё пытаюсь найти вариант через sql-выборку. Пока не получается. В лучшем случае, смог вывести сортированный по дате и сгруппированный по fromid список, но это не то.

Друзья,посоветуйте, есть ли возможность решить эту задачу, не прибегая к работе с php массивами? Я даже не могу привести никакого кода sql-выборки, так как не понимаю, с какой стороны подступиться???(((

Намекните, пожалуйста, в какую сторону смотреть - я бы с удовольствием "покопался" далее...

Заранее всем благодарен!
  • Вопрос задан
  • 2007 просмотров
Решения вопроса 1
mg15
@mg15 Автор вопроса
Учусь
Спасибо за помощь! В этом случае, получается, выводит все пары полей, которые есть в таблице, без уникальности - вот так:
a344d3beb18241f99e68412f31367492.jpg
Сгруппировать их с помощью GROUP BY не получается, не могу понять - почему?

-------------------------------------------------------------------------
29.05.17 22:40

Получилось решить так:
$query = "SELECT DISTINCT IF(fromid < toid, fromid, toid) AS user1, IF(fromid >= toid, fromid, toid) AS user2, data
  FROM table ORDER BY data DESC";
    $rst=mysql_query("SELECT user1,user2 FROM ($query) AS rows GROUP BY user1,user2 ORDER BY data DESC");


Возможно, есть более простой вариант, но я - к сожалению - не смог найти его! Быть может, более знающие товарищи порекомендуют? Как бы то ни было - цель достигнута: происходит выборка всех уникальных диалогов чата с сортировкой их по дате последнего сообщения.

Спасибо пользователю Rsa97, подтолкнувшему меня в нужном направлении!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вот вариант решения "в лоб":
SELECT DISTINCT IF(`fromid` < `toid`, `fromid`, `toid`) AS `user1`, 
                IF(`fromid` >= `toid`, `fromid`, `toid`) AS `user2`,
                `date`
  FROM `table`;
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы