сортировка по двум критериям

timer0x01

Новичок
сортировка по двум критериям

Здравствуйте!
Проблема такая:
Есть база данных на MySQL для фирменного каталога:

companyid int(10) UNSIGNED auto_increment primary key
pay int(11)
date_pay_starts datetime
company_name text

Надо зделать select запрос с такой сортировкой:
1) Первые в списке должны быть все фирмы у которых значение pay='1' и они должны быть сортированы по date_pay_starts по нарастанию, пример:
company_name_1 2006-10-30 13:42:55
company_name_2 2006-11-01 17:01:42
2) Когда список компаний у которых pay='1' изчерпается, сразу идут компании у которых pay='0', но они должны сортироваться по убыванию companyid а не по дате, пример:
company_name_3 15
company_name_4 14
Я посмотрел по форуму, но не нашёль ничего, которое бы мне помогло. :(
Единственно вот ето: http://phpclub.ru/talk/showthread.php?s=&threadid=88104&highlight=%D1%EE%F0%F2%E8%F0%EE%E2%EA%E0+order+by . Но опять же не могу понять, что за числа в order by ..
Буду признателен за помощь и СПАСИБО заранее!
 

Bart

Новичок
select * from your_table where pay='1' ORDER BY date_pay_starts

select * from your_table where pay='0' ORDER BY companyid DESC

в два запроса можно сделать
 

zerkms

TDD infected
Команда форума
[sql]
...
ORDER BY `pay` DESC, IF(`pay` = 1, `date_pay_starts`, -1 * `compayid`) ASC
[/sql]
 

timer0x01

Новичок
Bart мне надо в один запрос ...
zerkms что-то я не могу понять мне надо если pay=1 то по возростанию дате, а если pay=0, то по убыванию companyid
. . . ORDER BY `companyid` DESC , IF (
`pay` = 1, `date_pay_starts` , - 1 * `compayid`
) ASC что ли ?

И вот ето не понятно что озночает "- 1 * `compayid`" ?
Можно полный запрос составить, пожалуйста?
 

zerkms

TDD infected
Команда форума
timer0x01
-1 как раз и позволит сортироваться в обратную ASC сторону, т.е. в DESC
напиши что у тебя не получается и будем тогда думать дальше
 

timer0x01

Новичок
zerkms
У меня выдаёт ошибку "mysql_num_rows(): supplied argument is not a valid MySQL result ...."
Вот ето полный запрос:
PHP:
$query = "select companyid, pay, date_pay_starts, date_pay_ends, name_lat, name_cyr from companies where category='$category' and status='1' ORDER BY `pay` DESC , IF ( `pay` = 1, `date_pay_starts` , - 1 * `compayid` ) ASC limit 5";
Но не работает ...

Без всяких сортировок запрос такой:
PHP:
$query = "select companyid, pay, date_pay_starts, date_pay_ends, name_lat, name_cyr from companies where category='$category' and status='1' limit 5"
и работает ..
 

timer0x01

Новичок
PHP:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /www/cat.inc.php on line 15
PHP:
$query = "select companyid, pay, date_pay_starts, date_pay_ends, name_lat, name_cyr from companies where category='$category' and status='1'  ORDER BY `pay` DESC , IF ( `pay` = 1, `date_pay_starts` , - 1 * `compayid` ) ASC limit 5";

$result = mysql_query($query);

$num_rows = mysql_num_rows($result);  <--line 15
 

zerkms

TDD infected
Команда форума
timer0x01
mysql_error() где?
ты по ссылке ходил??????
 

timer0x01

Новичок
PHP:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /www/cat.inc.php on line 15

Unknown column 'compayid' in 'order clause'
Спасибо
 

timer0x01

Новичок
Да сейчас работает, но не соблюдается условие номер 2 ...
Т.е. заявка:
PHP:
$query = "select companyid, pay, date_pay_starts, date_pay_ends, name_lat, name_cyr from companies where category='$category' and status='1' ORDER BY `pay` DESC , IF ( `pay` = 1, `date_pay_starts` , - 1 * `companyid` ) ASC limit 5";
1) Сортирует все фирмы у которых значение pay='1' и они сортируются по date_pay_starts по нарастанию .. здесь нет проблем.
2) Фирмы у которых pay='0' НЕ сортируются по убыванию companyid .. a сортируются по возростанию ..
Т.е. :
PHP:
1
2
3
4
5
А должно быть :
PHP:
5
4
3
2
1
Стоит учесть может быть, что у фирм с pay='0', date_pay_starts равен NULL
Спасибо!

-~{}~ 04.11.06 17:50:

Я попробовал ещё раз просмотреть документацию и форум, но ничего не получается .. Вот пример:
PHP:
$query = "select companyid, pay, date_pay_starts, date_pay_ends, name_lat, name_cyr, status_img, short_text_en, short_text_bg, short_text_nl from companies where category='$category' and status='1' CASE WHEN `pay`='1' THEN ORDER BY `date_pay_starts` ASC ELSE ORDER BY `companyid` DESC END";
или

PHP:
$query = "select companyid, pay, date_pay_starts, date_pay_ends, name_lat, name_cyr, status_img, short_text_en, short_text_bg, short_text_nl, CASE WHEN pay=1 THEN date_pay_starts WHEN pay=0 THEN companyid ELSE 0 END AS for_order from companies where category='$category' and status='1' CASE WHEN for_order=date_pay_starts THEN order by date_pay_starts ASC WHEN for_order=companyid THEN order by companyid DESC ELSE 0 END
ГДЕ ГРАБЛИ ? :|
 
Сверху