![]() |
Сортировка [php]
Как сделать такую сортировку на mysql: данные сортируются по времени, и одновременно есть поле optional в котором стоят значения 0 и 1, 0(main) 1(optional) время у них одинаковое, надо сделать так чтобы main всегда стоял перед optional, как это сделать?
cid | name | optional 0 | 10:00 Dcba | 0 1 | 10:00 Abcd | 1 2 | Abcd | 0 так же есть поля без времени (Abcd) они должны быть в самом начале, в каком порядке не важно, как все это организовать? |
order by optional, name <--примерно так
|
нет, так optional получается в самом конце
а надо чтобы все сортировалось по времени и если время одинаковое, то optional должен идти после main, т.е должно получиться чтото (main) 09:00 чтото (main) 10:00 чтото (main) 10:00 чтото (optional) 12:00 чтото (main) 14:00 чтото (main) |
order by name,optional
|
Цитата:
|
а что выходит когда так пишешь?
строку запроса полностью покажи |
select * from w_list where сid='$info[сid]' order by name
когда дописываю order by name, optional ничего не меняется |
странно у меня работает
например: Код:
mysql> select id,date,money from bicbets order by date,money; |
select * from w_list where сid='$info[сid]' order by name,optional asc
Вот так это будет. Только поля без цифр будут в конце. А если сделать так order by name desc,optional asc, то они будут в начале, но остальные данные отсортируются по убыванию. Так что если обязательно надо сортировать по возрастанию даты, то лучше сделать два запроса, сначала достать без даты, а потом остальное. |
у меня не работает OS Win2003, MySQL 3.23.52, PHP 4.3.5, Apache 2.0.47
|
Так данные сортируются не правильно или совсем не работает? Покажи что тебе база выдает в ответ на запрос.
|
есть поля
12:00 3чтото | 0 10:00 2чтото | 0 чтото | 0 10:00 1чтото | 1 при запросе select * from w_list order by name получается 10:00 1чтото | 1 10:00 2чтото | 0 12:00 3чтото | 0 чтото | 0 а нужно чтото | 0 10:00 2чтото | 0 10:00 1чтото | 1 12:00 3чтото | 0 добавление optional desc (asc) ничего не меняет... |
optional asc сортирует по возрастанию т.е. первым будут данные где optional 0 потом 1. Я уже написал что если хочешь чтобы сначала были данные без даты, то либо делаешь два запроса, либо(если все равно как сортировать дату по возрастанию или по убыванию) добавляешь к order by name desc данные без даты будут вначале, а потом пойдут по убыванию с датой.
|
с датой я уже понял, надо чтобы обязательно было по возрастанию...
но optional asc ничего не меняет... |
Как это ничего не меняет?
SQL-запрос: SELECT * FROM `test` WHERE 1 ORDER BY name, optional ASC; cid name optional 0 10:00 fghjkhg 0 1 10:00 fghjkhg 1 0 11:00 0 0 fef 0 Если будет optional desc будет вот так cid name optional 0 10:00 fghjkhg 1 1 10:00 fghjkhg 0 0 11:00 0 0 fef 0 А чтобы получить данные отсортированные как ты хочешь надо два запроса прогнать. Первый что-то типа: SELECT * FROM `test` WHERE name not LIKE '%:%' (ну или как хочешь отличать данные с датой и без) Второй: SELECT * FROM `test` WHERE name LIKE '%:%' order by name,optional asc и потом полученные данные совмещаеш. |
0 10:00 fghjkhg 0
1 10:00 fghjkhg 1 получается если fghjkhg и там и там написано.. а ты попробуй в первой строке написать 'bbbbb' а во второй 'aaaaa' и посмотри что получится |
Все нормально получается:
SELECT * FROM `test` WHERE 1 ORDER BY name, optional ASC; cid name optional 0 10:00 aaaaa 0 0 10:00 aaaaa 1 0 10:00 bbbbb 0 0 10:00 fghjkhg 0 1 10:00 fghjkhg 1 0 11:00 0 Так надо? Или я чё-то недопонимаю? Просто я asc зря добавил, если его не указать по умолчанию сортировка и так по возрастанию будет. так что на него можно забить. |
_ARMAGEDDON_
пагади, у тебя '10:00 aaaaa' - это одно поле и ты хочешь чтоб сотировало не учитывая буквы ( только '10:00 ) ? |
попробуй вот так
0 10:00 bbbbb 0 0 10:00 aaaaa 1 0 10:00 ссссс 0 1 10:00 cghjkhg 1 0 10:00 fghjkhg 0 0 11:00 0 если отсортируется, то значит мне сегодня больше нельзя работать :) Цитата:
|
0 10:00 bbbbb 0
0 10:00 aaaaa 1 0 10:00 ссссс 0 1 10:00 cghjkhg 1 0 10:00 fghjkhg 0 0 11:00 0 должно получиться 0 10:00 aaaaa 1 0 10:00 bbbbb 0 0 10:00 ссссс 0 1 10:00 cghjkhg 1 0 10:00 fghjkhg 0 0 11:00 0 |
нет, должно получиться
0 10:00 bbbbb 0 0 10:00 ссссс 0 0 10:00 fghjkhg 0 0 10:00 aaaaa 1 1 10:00 cghjkhg 1 0 11:00 0 |
ага, тут все уже не так просто
я прям сейчас и не знаю как это можно сделать |
Во у меня тоже так получилось. А если тебе надо сортировать только по времени и optional не учитывая букв чтобы вот так получилось
0 10:00 bbbbb 0 0 10:00 ссссс 0 0 10:00 fghjkhg 0 0 10:00 aaaaa 1 1 10:00 cghjkhg 1 0 11:00 0 легче дату и буквы разнести в разные колонки. |
мда :)
пойду попробую разнести... |
Тогда сортировать будешь вот так order by data,optional,name. Тогда и поля без даты сверху будут.
|
во, все работает, всем спасибо!
|
короче налицо неправильно составленнная бд, например не проведена нормализация(таблица не удовлетворяет даже первой нормальной форме).
|
и какая у нее должна быть нормальная форма?
|
первая нормальная форма(1 уровень нормализации), атрибуты должны быть атомарными, пример:
адрес(состоит из улица, дом, квартира и т.д.). в твоем случае дата и текст - это разные атрибуты(в физическом представлении колонки). и это на первый взгляд, а вообще скорее всего там нужно будет ещё и выносить в отдельную таблицу, но это уже можно сказать, зная подробно условия и предметную область. |
| Часовой пояс GMT +4, время: 00:31. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.