IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Сортировка [php] (https://www.imho.ws/showthread.php?t=61082)

_ARMAGEDDON_ 07.06.2004 10:49

Сортировка [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) они должны быть в самом начале, в каком порядке не важно, как все это организовать?

Sheryld 07.06.2004 13:15

order by optional, name <--примерно так

_ARMAGEDDON_ 07.06.2004 13:33

нет, так optional получается в самом конце
а надо чтобы все сортировалось по времени и если время одинаковое, то optional должен идти после main, т.е должно получиться

чтото (main)
09:00 чтото (main)
10:00 чтото (main)
10:00 чтото (optional)
12:00 чтото (main)
14:00 чтото (main)

Gike 07.06.2004 13:39

order by name,optional

_ARMAGEDDON_ 07.06.2004 13:43

Цитата:

Gike:
order by name,optional
не помогает...

Gike 07.06.2004 13:49

а что выходит когда так пишешь?

строку запроса полностью покажи

_ARMAGEDDON_ 07.06.2004 13:55

select * from w_list where сid='$info[сid]' order by name

когда дописываю order by name, optional ничего не меняется

Gike 07.06.2004 14:04

странно у меня работает
например:
Код:

mysql> select id,date,money from bicbets order by date,money;
  +------+----------+-------+
  | id  | date        | money |
  +------+----------+-------+
  | 8239 | 20040530 |        2 |
  | 8240 | 20040530 |        2 |
  | 8241 | 20040530 |        3 |
  | 8243 | 20040530 |        5 |
  | 8242 | 20040530 |        6 |
  | 8244 | 20040530 |        9 |
  | 8245 | 20040601 |        54 |
  | 8246 | 20040604 |        5 |
  +------+----------+-------+


Sava 07.06.2004 14:14

select * from w_list where сid='$info[сid]' order by name,optional asc

Вот так это будет. Только поля без цифр будут в конце. А если сделать так order by name desc,optional asc, то они будут в начале, но остальные данные отсортируются по убыванию. Так что если обязательно надо сортировать по возрастанию даты, то лучше сделать два запроса, сначала достать без даты, а потом остальное.

_ARMAGEDDON_ 07.06.2004 14:16

у меня не работает OS Win2003, MySQL 3.23.52, PHP 4.3.5, Apache 2.0.47

Sava 07.06.2004 14:20

Так данные сортируются не правильно или совсем не работает? Покажи что тебе база выдает в ответ на запрос.

_ARMAGEDDON_ 07.06.2004 14:22

есть поля

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) ничего не меняет...

Sava 07.06.2004 14:31

optional asc сортирует по возрастанию т.е. первым будут данные где optional 0 потом 1. Я уже написал что если хочешь чтобы сначала были данные без даты, то либо делаешь два запроса, либо(если все равно как сортировать дату по возрастанию или по убыванию) добавляешь к order by name desc данные без даты будут вначале, а потом пойдут по убыванию с датой.

_ARMAGEDDON_ 07.06.2004 14:36

с датой я уже понял, надо чтобы обязательно было по возрастанию...
но optional asc ничего не меняет...

Sava 07.06.2004 14:46

Как это ничего не меняет?
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
и потом полученные данные совмещаеш.

_ARMAGEDDON_ 07.06.2004 14:57

0 10:00 fghjkhg 0
1 10:00 fghjkhg 1

получается если fghjkhg и там и там написано.. а ты попробуй в первой строке написать 'bbbbb' а во второй 'aaaaa' и посмотри что получится

Sava 07.06.2004 15:08

Все нормально получается:
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 зря добавил, если его не указать по умолчанию сортировка и так по возрастанию будет. так что на него можно забить.

Gike 07.06.2004 15:12

_ARMAGEDDON_
пагади, у тебя '10:00 aaaaa' - это одно поле и ты хочешь чтоб сотировало не учитывая буквы ( только '10:00 ) ?

_ARMAGEDDON_ 07.06.2004 15:15

попробуй вот так

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

если отсортируется, то значит мне сегодня больше нельзя работать :)

Цитата:

Gike:
пагади, у тебя '10:00 aaaaa' - это одно поле и ты хочешь чтоб сотировало не учитывая буквы ( только '10:00 ) ?
да, это одно поле, я хочу чтобы сортировалось все, но если в поле optional стоит 0 это поле будет показываться первым.. если 1 вторым

Gike 07.06.2004 15:17

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

_ARMAGEDDON_ 07.06.2004 15:20

нет, должно получиться

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

Gike 07.06.2004 15:23

ага, тут все уже не так просто
я прям сейчас и не знаю как это можно сделать

Sava 07.06.2004 15:23

Во у меня тоже так получилось. А если тебе надо сортировать только по времени и 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

легче дату и буквы разнести в разные колонки.

_ARMAGEDDON_ 07.06.2004 15:27

мда :)
пойду попробую разнести...

Sava 07.06.2004 15:30

Тогда сортировать будешь вот так order by data,optional,name. Тогда и поля без даты сверху будут.

_ARMAGEDDON_ 07.06.2004 15:34

во, все работает, всем спасибо!

Sheryld 08.06.2004 10:40

короче налицо неправильно составленнная бд, например не проведена нормализация(таблица не удовлетворяет даже первой нормальной форме).

_ARMAGEDDON_ 08.06.2004 11:17

и какая у нее должна быть нормальная форма?

Sheryld 09.06.2004 03:58

первая нормальная форма(1 уровень нормализации), атрибуты должны быть атомарными, пример:

адрес(состоит из улица, дом, квартира и т.д.).

в твоем случае дата и текст - это разные атрибуты(в физическом представлении колонки).

и это на первый взгляд, а вообще скорее всего там нужно будет ещё и выносить в отдельную таблицу, но это уже можно сказать, зная подробно условия и предметную область.


Часовой пояс GMT +4, время: 00:31.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.