SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 05.12.2008 21:37:22

chosser
Участник
Зарегистрирован: 05.12.2008
Сообщений: 4

order как сделать

доброго времени суток !!! Не поможите с одной проблемой. Допустим есть таблица с двумя полями id, category. Сортировка производилась при помощи простого запроса SELECT * FROM $db_category  ORDER BY category и соответственно я получал список категории в алфавитном порядке. А можно ли с помощью запроса сделать так что бы запрос сначала выдал мне две категории с определенным id а затем все остальные в алфавитном порядке ???
объясню зачем, просто по этому запросы выводится список городов одной из стран, но надо что бы столица выводилась первой.

Неактивен

 

#2 05.12.2008 21:52:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: order как сделать

Можно, но для этого вам надо знать эти id. Если я правильно понимаю, то в данной постановке задачи они даются как известные константы:


select if((id=const1 or id=const2),0,1), t.* from table_name t oreder by 1,category;
 


В данном запросе используется тот факт, что в части ORDER BY можно использовать алиас или номер позиции колонки в перечислении выводимых колонок после SELECT.

P.S. Возможно вам проще будет ввести дополнительную колонку, указывающую является столицей или нет (значения 1 и 0) и делать OREDER BY col1,col2

Неактивен

 

#3 06.12.2008 08:06:07

chosser
Участник
Зарегистрирован: 05.12.2008
Сообщений: 4

Re: order как сделать

спасибо буду пробовать

Неактивен

 

#4 06.12.2008 18:21:59

chosser
Участник
Зарегистрирован: 05.12.2008
Сообщений: 4

Re: order как сделать

Спасибо Вам большое сработало, вводить еще одну колонку не получится (точнее будет сложновато) так как это уже работающий проект, со сложной структурой.
Вот такой вопрос  - запрос сработал, но эти две категории он поставил вначале и по закону подласти эти два значение надо поменять местами, то есть он их тоже в алфавитном порядке поставил, и тот который дожен быть первым из за алфавитного порядка стал вторым. Как это можно подправить )))
А вообще огромное спасибо, сижу учу sql но кое что надо уже сейчас подправить, вот и обращаюсь за помошью.

Неактивен

 

#5 06.12.2008 18:37:55

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: order как сделать

SELECT IF(id=const1,0,1),IF(id=const2,0,1), t.* FROM table_name t ORDER BY 1,2,category;


При необходимости меняете местами const1 и const2 или ORDER BY 2,1,category

Но это направильный подход, так как идет подгонка запроса под конкретный частный случай. А если в будущем столица измениться? Искать в программном коде нужные куски и менять константы и запросы? Лучше всё-таки подумать над структурой данных, а то в будущем накопится таких заплаток и уже не разгребете.

Неактивен

 

#6 07.12.2008 03:23:05

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: order как сделать

Если нужно поменять направление сортировки, то надо добавить после имени (или номера) столбца слово DESC, например, ORDER BY 1 DESC, 2, category DESC.

Неактивен

 

#7 08.12.2008 21:31:05

chosser
Участник
Зарегистрирован: 05.12.2008
Сообщений: 4

Re: order как сделать

Спасибо большое все работет !! Просто проект работает и сдан (4 месяца), для одной из операций использовалься готовый скрипт, и вот клиенту захотелось поменять расположение городов, можно было конечно выходной массив разобрать при помощи PHP но проще было запрос отсортировать, а вот таких тонких знаний пока нет, а Вы очень сильно помогли )) Спасибо.

Неактивен

 

#8 21.06.2009 20:43:52

XJIOP
Участник
Зарегистрирован: 28.02.2009
Сообщений: 22

Re: order как сделать

не хочу плодить темы но уменя тоже проблема с сортировкой, а именно нужно отсортировать по дате с лимитом на выход 3 и еще доп. сортировать по enum(yes,no)

SELECT added, otvet FROM messages WHERE added > '".$st."' AND sender = '".$CURUSER["id"]."' ORDER BY added DESC, otvet DESC LIMIT 3

на выходе получаю
no - 2009-06-21 18:29:31
yes - 2009-06-21 18:29:08
no - 2009-06-21 18:28:44

что уже не то что нужно, должно быть yes на первой строчки. тоесть нужно сначала выбрать последнию дататайм из 3 и доп. из них отсортировать по ответу yes,no

помогите разобратся =/

Неактивен

 

#9 22.06.2009 21:08:30

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: order как сделать

Только через подзапрос / объединение:

SELECT * FROM
(SELECT added, otvet
FROM messages
WHERE added > $st
AND sender = $CURUSER
ORDER BY added DESC
LIMIT 3) t ORDER BY otvet

Неактивен

 

#10 22.06.2009 21:40:22

XJIOP
Участник
Зарегистрирован: 28.02.2009
Сообщений: 22

Re: order как сделать

спасибо! а жаль что только через подзапрос думал можно как то без него ))

Отредактированно XJIOP (22.06.2009 21:40:52)

Неактивен

 

Board footer

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