Сортировка и группировка

Статус
Закрыто для дальнейших ответов.

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Таблица `msg`
id | poluchatel | otpravitel | read | data
1 | nick1 | nick_2 | Прочитано | unix_time
2 | nick2 | nick_3 | Новое | unix_time
.......
100000 | nick1 | nick_2| Новое | unix_time
Нужно вывести все логины, с которыми я переписывался и отсортировать их по новым, т.е сперва "Новое", а потом все остальные по дате получения
Сперва было так:
Код:
select * from `msg` where `poluchatel` = '$my_login' group by `otpravitel` order by `read` asc, `data` desc
Но этот вариант нифига не работает, он сперва группирует, а потом сортирует. Мне нужно сперва отсортировать(что бы сперва шли новые письма, а потом письма по дате убывания), а уж потом сгруппировать их все по никам..
Как такое можно реализовать?
 

mrlasking

$_GET['rich'] or die('trying');
Регистрация
22.05.2012
Сообщения
323
о.О дык вложеным же запросом.
 

Volter9

defined('SURRENDER') or die(); // StarWars
Регистрация
27.05.2012
Сообщения
1 145
А может стоит Join'ы использовать?
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
блооо.. ну помогите кто-нить:( неужеле придется регаца ещё на одном форуме, чтобы помогли составить запрос гг
 

Volter9

defined('SURRENDER') or die(); // StarWars
Регистрация
27.05.2012
Сообщения
1 145
Код:
select (select `msg` where `poluchatel` = '$my_login' order by `read` asc, `data` desc) as "msg" group by `otpravitel`
Думаю так. поправьте гуру если чего-то не так...
 

Indev29

Just Code...
Регистрация
15.08.2012
Сообщения
370
А поле read лучше сделать цифрами (0 - новое, 1 - прочитано). Представьте у вас тысяча сообщений. Неоправданное дублирование информации.
 

brevis

Well-Known Member
Регистрация
10.08.2010
Сообщения
452

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Код:
select (select `msg` where `poluchatel` = '$my_login' order by `read` asc, `data` desc) as "msg" group by `otpravitel`
Думаю так. поправьте гуру если чего-то не так...
Эмм.. не.. такой вариант не подходит((

А поле read лучше сделать цифрами (0 - новое, 1 - прочитано). Представьте у вас тысяча сообщений. Неоправданное дублирование информации.
Знаю, но менять не охото..(

http://sqlfiddle.com/#!2/bef05/1 А вообще -- странное условие задачи и странная структура таблицы.
Первый вариант подходит!!! :)
Но как подсчитать колличество строк, чтобы сделать постраничный вывод? count(*)? Не получается из-за конструкции if(), там всегда выводятся логины :(
Я хочу сделать как в "одноклассниках", открываешь окошко, а в нем все ники, с которыми я переписывался и написано сколько новых писем и всего сообщений в переписке с этим человеком. А потом, когда кликаешь на нужный ник, то открывается уже полный лог переписки, сам текст)
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Всё, решил задачку) Запарился уже..
Код:
$login = 'admin';
//Узнаем сколько всего переписок
SELECT COUNT(*) FROM (SELECT (IF( `poluchatel` = '$login', `otpravitel` , `poluchatel` )) AS `login` FROM `messages` WHERE (`poluchatel` = '$login'OR `otpravitel` = '$login') GROUP BY `login`) `messages`;
//Выполняются какие-то действия для постраничной навигации
//Выбираем сами записи с $start по $ch
select `msg`.*, count(*) as `count` from (select `id`, (if (`poluchatel`='$login', `otpravitel`, `poluchatel`)) as `login`, `read`, `data` from `messages` where (`poluchatel` = '$login' OR `otpravitel` = '$login') order by `data` desc) as `msg` group by `msg`.`login` order by `data` desc limit $start, $ch;
 
Статус
Закрыто для дальнейших ответов.
Верх Низ