Сортировка с условием и изменением порядка

Avenus

Under Glory Yield
Сортировка с условием и изменением порядка

Подскажите, пожалуйста, как изменить запрос:
PHP:
SELECT *,IF(условие, поле1, поле2) as сортировка ... ORDER BY сортировка
Чтобы для поле1 порядок был по умолчанию ASC,
а для поле2 - DESC?
Не могу разобраться :(
 

Avenus

Under Glory Yield
Вообще сообщения между пользователями...
Часть таблицы сообщений, поля:
PHP:
ID от кого, ID кому, прочтено....
и еще дата, сам текст и прочее
Вот, собственно надо показывать с сортировкой по дате по убыванию, но непрочтенные первыми.

-~{}~ 25.02.09 13:12:

Вот я и пишу:
PHP:
SELECT *,IF(не от меня и не прочтено, прочтено, дата) as сортировка ... ORDER BY сортировка
Здесь надо как-то для сортировки по дате сделать по убыванию, а по прочтению по возрастанию...

Конечно, можно было бы переделать скрипты на статус прочтения наоборот :)
 

Splurov

Новичок
unread ENUM('yes', 'no')
ORDER BY unread, dt DESC
?

(после пояснения не покатит)
 

Avenus

Under Glory Yield
Может быть как-то по-другому организовать хранение данных?

-~{}~ 25.02.09 15:10:

Кстати, попробовал переставить статус прочтения на
прочтено - 0, не прочтено - 1, чтобы сортировать по desc по обеим полям, вообще неверно сортирует.

Т.е. такое не получается:
from=2, to=1, date=2009-02-01, read=0
from=1, to=3, date=2009-02-10, read=0
from=3, to=1, date=2009-02-02, read=1

Где from - от кого, to - кому, date - дата, read - прочтено или нет (0 - не прочтено)

Уже думаю, может надо сначала выбирать только новые мне, а потом еще другим запросом остальные... склеивать массивы и выдавать страницу? :(
 

x-yuri

Новичок
ну если тебе так нужно устроить сортировку в двух направлениях сразу, то тебе скорее UNION нужен. Но я что-то не припомню, чтобы где-нибудь видел такое
 

Avenus

Under Glory Yield
x-yuri, так я и говорю, может кто предложит по-другому организовать это дело... с сообщениями :)
 

x-yuri

Новичок
в Gmail, например, сортировка по дате по убыванию, но непрочтенные сообщения выделяются жирным
 

Avenus

Under Glory Yield
Да, я могу как угодно их выделить, но необходимо их показать первыми :) в списке
 

x-yuri

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

тогда ORDER BY read ASC, date DESC

или надо еще, чтобы для read=0 ORDER BY date ASC, а для read=1 ORDER BY date DESC? тогда - UNION. Только это извращенный вариант имхо
 

Avenus

Under Glory Yield
В общем когда пишу так:
PHP:
SELECT *, IF(from_id!="Мой ID" and read=0,read,date) AS sort ORDER BY sort
Так показывает новые сообщения мне первыми, а остальные с возрастанием по дате... что очень плохо, т.к. самые старые сообщения всегда сверху, кроме не прочтенных.

-~{}~ 25.02.09 15:42:

x-yuri, немного не так... не прочтенные надо всегда сверху, неважно насколько они старее остальных...
А вот остальные, прочтенные, строго по дате... desc
Т.е. чем старее, тем дальше :)

-~{}~ 25.02.09 15:44:

ORDER BY read ASC, date DESC
так неверно почему-то сортирует...

-~{}~ 25.02.09 15:44:

Даже если поставить:
PHP:
IF(from_id!="Мой ID" and read=0,read,"")
-~{}~ 25.02.09 16:08:

Что же, без UNION никак не обойтись? :(
 

findnext

Новичок
без UNION никак не обойтись, у меня была похожая проблема, смог решить только через UNION
 

Avenus

Under Glory Yield
findnext, а на сколько он будет сильно тормозить весь процесс? ... или незначительно? :)
Может быть есть способ сначала выбрать все с сортировкой по дате и добавить флаг для новых сообщений, а потом отсортировать массив по значению?
 

findnext

Новичок
Avenus
UNION не должен тормозить процесс если запрос составлен грамотно.
Может быть есть способ сначала выбрать все с сортировкой по дате и добавить флаг для новых сообщений, а потом отсортировать массив по значению?
не нужно
 

x-yuri

Новичок
Avenus UNION нужен, чтобы для read=0 ORDER BY date ASC, а для read=1 ORDER BY date DESC. Это твой случай?

-~{}~ 25.02.09 16:05:

ORDER BY read ASC, date DESC
так неверно почему-то сортирует...
покажи весь запрос
 

findnext

Новичок
чего то я нерпавильно вопрос понял.....
ORDER BY read ASC, date DESC вполне должно подойти, покажи запрос
 

Avenus

Under Glory Yield
Вот весь запрос:
PHP:
SELECT to, from, msg, IF((from!='myid' AND read=0), read, date) AS sort
FROM messages WHERE from='myid' OR to='myid' GROUP BY from ORDER BY sort
В котором:
messages - таблица сообщений
to - кому сообщение (id)
from - от кого сообщение (id)
read - флаг прочтения
date - дата сообщения
'myid' - мой id
Выбираю все сообщения от меня или мне.

Надо сортировать по убыванию даты, т.е. чем старее сообщения, тем они дальше. НО, непрочтенные мной! должны быть первыми. Вот, флаг read для обоих и "1" ставится только получателем после прочтения получателем.

-~{}~ 26.02.09 00:08:

Т.е. если взять несколько сообщений:
1) date='2009-20-02', from='notmyid', to='myid', read=0 - новое мне, непрочитанное мной
2) date='2009-24-02', from='myid', to='notmyid', read=0 - новое от меня, непрочитанное получателем
Если их сортировать просто ORDER BY read, date DESC, то сначала будет (2) сообщение, а нужно чтобы сначало было (1) сообщение, т.к. хоть оно и старее, НО я его не прочитал еще.
 

x-yuri

Новичок
значит надо сначала сортировать по (from!='myid' AND read=0), а потом по date. Просто не надо меня буквально понимать ;-)
 

Avenus

Under Glory Yield
x-yuri, в смысле? С использованием UNION? :)
Я опустил в запросе несколько JOIN-ов, но они не влияют на сортировку... только присоединение доп. данных.

Ведь для UNION придется в обоих SELECT делать те же JOINы, правильно я понимаю?
 

x-yuri

Новичок
где я сказал про UNION в последнем посте? имелось в виду 'ORDER BY read, date DESC', только read = (from!='myid' AND read=0)
а следующая проблема, которая тебя ждет, похоже, GROUP BY
 
Сверху