SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.12.2013 01:16:16

Евгений Андреевич
Участник
Зарегистрирован: 18.12.2013
Сообщений: 10

Как сделать сортировку по полю, которое не участвует в запросе с UNION?

Сделал систему личных сообщений на сайте и мне надо выводить список диалогов с пользователями, отсортированный по дате последнего сообщения.

Есть тестовая таблица:
INSERT INTO `private` (`id`, `fromid`, `toid`, `message`, `posted`, `status`) VALUES
(64, 50136, 6, 'ьььььььььь', 1387275746, 1),
(65, 6, 50136, 'пум-пурум', 1387277848, 0),
(66, 37159, 52705, 'ььььььььььвв', 1387300276, 0),
(67, 35475, 6, 'ПППППППППППпппроверка!!!', 1387324208, 1),
(63, 50136, 35475, 'есть контакт', 1387275706, 1),
(61, 6, 5, 'ввввввввввв', 1387243801, 0),
(60, 35475, 50136, 'Ещё одна проверка...', 1387232868, 1),
(62, 6, 1171, 'ввв', 1387243848, 0),
(59, 6, 50136, 'Проверка связи...', 1387230582, 1);

Мой запрос такой:
(select distinct `fromid` from private where `toid`=$userID)
UNION
(select distinct `toid` from private where `fromid`=$userID) limit 20

Он выводит id пользователей, с которыми у меня есть диалог (может только я им написал, может только они мне написали, а может оба друг другу написали). По этим уникальным id я потом вывожу инфу.

Задача:
сделать сортировку по дате последнего сообщения.

Когда делаю так:
(select distinct `fromid` from private where `toid`=$userID)
UNION
(select distinct `toid` from private where `fromid`=$userID) order by posted desc limit 20

то конечно выходит ошибка, т.к. posted нет в выборках. Как правильно сделать?

Неактивен

 

#2 18.12.2013 02:16:21

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Как сделать сортировку по полю, которое не участвует в запросе с UNION?

Попробуйте

( SELECT `fromid`,max(`posted`) p FROM `private` WHERE `toid` = 6 GROUP BY `fromid` )
UNION
( SELECT `toid`,max(`posted`) p FROM `private` WHERE `fromid` = 6 GROUP BY `toid` )
ORDER BY p;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 18.12.2013 10:41:37

Евгений Андреевич
Участник
Зарегистрирован: 18.12.2013
Сообщений: 10

Re: Как сделать сортировку по полю, которое не участвует в запросе с UNION?

Тогда выводит:
fromid     p По возрастанию
5     1387243801
1171     1387243848
50136     1387275746
50136     1387277848
35475     1387324208

Т.е. 50136 2 раза (это переписка 50136 -> 6 и 6 -> 50136), надо, чтобы этот id был один раз.

Неактивен

 

#4 18.12.2013 10:46:09

Евгений Андреевич
Участник
Зарегистрирован: 18.12.2013
Сообщений: 10

Re: Как сделать сортировку по полю, которое не участвует в запросе с UNION?

Сделал так:
select distinct fromid from(
( SELECT `fromid`,max(`posted`) p FROM `private` WHERE `toid` = 6 GROUP BY `fromid` )
UNION
( SELECT `toid`,max(`posted`) p FROM `private` WHERE `fromid` = 6 GROUP BY `toid` )
ORDER BY p desc) res

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson