[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: сортировка по номеру, номер - не целое число
Yulk
Необходимо отсортировать выводимые из MySQL данные по номеру, номер в виде 1, 2, 2/1, 2/2, 3... тип varchar(10)... Есть какой-нибудь способ?



Спустя 1 час, 8 минут, 28 секунд (10.04.2009 - 12:15) fever написал(а):
1) какая тут закономерность между строками (чтобы расположить их в нужном порядке)? Я так подозреваю, что это что-то вроде глав и под-глав в содержании? Типа 1, 1.1.1, 1.1.2, 1.2, 1.2.1, 2 и т.д.?
2) сколько таких "подглав" может быть в одном элементе? может ли быть, скажем, 1/2/2/4/2 ? Есть какие-то ограничения кроме как на кол-во символов в varchar(10)?

Спустя 9 минут, 23 секунды (10.04.2009 - 12:24) sergeiss написал(а):
В PostgreSQL я попробовал - получается smile.gif Только обязательное условие, что поле - либо простое число (в символьном представлении), либо число со знаком '/' и не важно, что там далее. Точнее, можно сделать даже набор разных знаков. Код немного усложнится, но принцип останется.

Идея такая: из этого поля надо создать дополнительное поле целого типа. Если в поле есть знак '/', то тогда выбираем все знаки до искомого, и преобразуем к целому типу.
Если в поле нету этого специального знака, то тогда просто преобразуем к целому типу.
Далее даем полю своё имя, и сортируем по нему.

Все используемые возможности и функции (case, strpos, substr) являются стандартными (вроде бы).

SQL
select *,

case
when strpos(key_field,'/')>0 then cast( substr( key_field, 1, strpos(key_field, '/')-1) as integer )
else cast (key_field as integer)
end
as ind

from table1 order by ind


Вот и всё, собственно.

PS. Ежели надо добавить дополнительно сортировку по той части, которая идет после знака '/', то тогда надо сделать еще одно дополнительное поле, и сортировать по ним обоим одновременно. Надо только будет брать ту часть, которая идет после спецзнака, либо записывать ноль в дополнительное поле.

Спустя 50 минут, 45 секунд (10.04.2009 - 13:15) Yulk написал(а):
Спасибо за идею... А в MySQL разве такое сработает? Что-то у меня не получается...

Спустя 14 минут, 2 секунды (10.04.2009 - 13:29) sergeiss написал(а):
Цитата (Yulk @ 10.04.2009 - 13:15)
Спасибо за идею... А в MySQL разве такое сработает? Что-то у меня не получается...

Должно сработать. Посмотри повнимательнее описание синтаксиса для CAST и CASE.
Не исключено, что там есть какие-то отличия, но в принципе всё должно быть также.

И еще - выложи сюда свой запрос, который ты формируешь. Не исключено, что там где-то сидит ошибка. Посмотрим вместе.

Спустя 1 час, 24 минуты, 5 секунд (10.04.2009 - 14:53) Yulk написал(а):
fever
нет, тут нет такой сложной вложенности, это номера писем и могут быть номера с дробью - дополнения к самим письмам... не более smile.gif

sergeiss
попробую еще сама покопаться, если уж не получится разобраться - попробуем вместе smile.gif

Спустя 8 минут, 47 секунд (10.04.2009 - 15:02) sergeiss написал(а):
Цитата (Yulk @ 10.04.2009 - 14:53)
sergeiss
попробую еще сама покопаться, если уж не получится разобраться - попробуем вместе smile.gif

ОК, такой подход очень даже правильный smile.gif

Спустя 1 час, 8 минут, 24 секунды (10.04.2009 - 16:10) Yulk написал(а):
Сделала немного по-другому, с помощью SUBSTRING_INDEX, вроде все правильно сортирует кроме одного момента : сначала ставятся номера с дробями, потом уже без дроби:
122
123/1
123/2
123
124
...
SQL
SELECT *
FROM mail ORDER BY CAST(SUBSTRING_INDEX(nomer_in,'/',1) AS UNSIGNED INTEGER),
CAST(SUBSTRING_INDEX(nomer_in,'/',-1) AS UNSIGNED INTEGER)

Спустя 4 минуты, 51 секунда (10.04.2009 - 16:15) sergeiss написал(а):
Если это то, что тебе надо - то тогда "флаг в руки" smile.gif

Спустя 18 минут, 43 секунды (10.04.2009 - 16:34) Yulk написал(а):
нет, мне надо чтоб было так:
123
123/1
123/2
Как бы теперь еще этот момент поправить?
просто с CASE что-то я не очень разобралась, не получается...

Спустя 1 минута, 26 секунд (10.04.2009 - 16:35) vasa_c написал(а):
А просто в алфавитном порядке это не то?

Спустя 8 минут, 15 секунд (10.04.2009 - 16:43) FatCat написал(а):
Цитата (Yulk @ 10.04.2009 - 16:34)
нет, мне надо чтоб было так:
123
123/1
123/2

PHP
$key intval((str_replace("/",".",$key))*10);
rolleyes.gif

Спустя 22 минуты, 38 секунд (10.04.2009 - 17:06) Yulk написал(а):
vasa_c
числа в алфавитном порядке? smile.gif
FatCat
Тогда что за запрос получится? Так:
SQL
SELECT *
FROM mail ORDER BY intval((str_replace("/",".",nomer_in))*10)

не работает, выдает ошибку...

Спустя 1 час, 2 минуты, 4 секунды (10.04.2009 - 18:08) FatCat написал(а):
Не, это уже в пхп сортируется. wink.gif

PHP
$temp_arr = Array();
$DB->query("SELECT key, text FROM table WHERE ... ");
while ( 
$r $DB->fetch_row() )
{
    
$key intval((str_replace("/",".",$r['key']))*10);
    
$temp_arr[$key] = $r['text']
}
ksort($temp_arr);

Спустя 1 час, 33 минуты, 5 секунд (10.04.2009 - 19:41) vasa_c написал(а):
Цитата
vasa_c
числа в алфавитном порядке? smile.gif

VARCHAR(10) не числа smile.gif

Спустя 3 часа, 5 минут, 45 секунд (10.04.2009 - 22:47) sergeiss написал(а):
Я бы все-таки предложил разобраться с CASE, чтобы его понять и чтобы он заработал так, как надо. Может быть, у тебя была проблема не с самим CASE, а с чем-то другим?
Попробуй выполнить простой запрос типа
SQL
select *,
case when nomer_in='122' then 122
else 0
end
as new_nomer_in from mail

Если этот запрос даст результат, то можно будет дальше разбираться.

По той методике, что я ранее предложил в этой теме, можно будет и вторую часть числа (после знака '/') вытащить элементарно, и в одном запросе всё сразу отсортировать правильно. Чтобы потом в ПХП только взять уже готовый результат.

Спустя 2 дня, 11 часов, 59 минут, 31 секунда (13.04.2009 - 10:46) Yulk написал(а):
Всем большое спасибо smile.gif
С сортировкой разобралась маленько, но к той же таблице еще одна задачка - надо выбрать наибольший и наименьший номер в каждых 100 записях, причем сортировка в таблице обратная ( нужно для постраничной навигации, чтобы рядом с номером страницы выводились с какого по какой номер письма на ней)
запрос делаю такой, но он не работает, то есть работает без учета LIMIT:
SQL
$query = "SELECT max(CAST(SUBSTRING_INDEX(nomer_in,'/',1) AS UNSIGNED INTEGER)) AS nomer_max, min(CAST(SUBSTRING_INDEX(nomer_in,'/',1) AS UNSIGNED INTEGER)) AS nomer_min FROM mail LIMIT $n, $p";

Спустя 7 минут, 3 секунды (13.04.2009 - 10:53) Yulk написал(а):
sergeiss
не увидела ваше сообщение когда писала предыдущее smile.gif
Насколько понимаю, должен быть везде 0 кроме 122 номера...так получилось...
понедельник, тормоз в голове ужасный smile.gif

Спустя 19 минут, 2 секунды (13.04.2009 - 11:12) sergeiss написал(а):
Здесь получается, что у тебя в запросе выбирается только одна строка, содержащая максимальное и минимальное значения.
Можно сделать сначала запрос на выборку 100 нужных значений, и тут же использовать этот запрос для выборки максимального и минимального значения.
Примерно так:
SQL
select max( nomer ), min( nomer)
from ( select ......... limit .....
) nomers

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

Поэтому я бы лучше нашел максимум и минимум уже в ПХП, на основании 100 выбранных данных.

PS. Я не понял, где получился ноль smile.gif В том запросе? Тогда вопрос: а есть ли а таблице значения с номером '122'? Я подразумевал, исходя из предыдущих сообщений, что этот номер там есть.

Спустя 16 минут, 55 секунд (13.04.2009 - 11:29) Yulk написал(а):
Есть 122 номер, просто он на 2 странице, не сразу сообразила...
Что-то до меня сегодня все с 3 раза доходит... huh.gif

А max и min в php с учетом особенностей номера...
Давайте сначала тогда с запросом с CASE разберемся smile.gif

Спустя 5 минут, 12 секунд (13.04.2009 - 11:34) sergeiss написал(а):
ОК, продолжаем насчет CASE.

Цитата (Yulk @ 13.04.2009 - 10:53)
Насколько понимаю, должен быть везде 0 кроме 122 номера...так получилось...
понедельник, тормоз в голове ужасный smile.gif

У меня только просьба не редактировать предыдущие сообщения, а писать новые в этой же теме - иначе можно просто не заметить, что что-то поменялось smile.gif

Получаем, что CASE отработал исправно.

Тогда попробуй такой запрос (это мой же запрос с 1-й страницы темы, но только изменены названия используемых функций):

SQL
select *,

case
when substring_index( nomer_in,'/',1)>0 then cast( substring( nomer_in, 1, substring_index(nomer_in, '/',1)-1) as integer )
else cast (nomer_in as integer)
end
as ind

from mail order by ind

Мне так кажется, что он должен быть успешным...

Спустя 7 минут, 2 секунды (13.04.2009 - 11:42) Yulk написал(а):
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource huh.gif

Спустя 5 минут, 16 секунд (13.04.2009 - 11:47) sergeiss написал(а):
Цитата (Yulk @ 13.04.2009 - 11:42)
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource huh.gif

После вызова mysql_query(....) напиши кое-что:
PHP
...mysql_query(...) or die( mysql_error() );


И ответ - давай сюда.

Спустя 47 минут (13.04.2009 - 12:34) Yulk написал(а):
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'integer ) else cast (nomer_in as integer) end as ind from mail_in order by i' at line 3

Спустя 12 минут, 38 секунд (13.04.2009 - 12:46) sergeiss написал(а):
Посмотрел хэлп по мюзиклу, помедитировал... smile.gif

Попробуй заменить в запросе 'integer' на 'unsigned integer' (в 2-х местах). Судя по хэлпу, просто 'integer' тут указывать нельзя, в отличие от Постгре.

Спустя 7 минут, 16 секунд (13.04.2009 - 12:54) Yulk написал(а):
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'unsigned integer) end as ind from mail_in order by ind' at line 4

Спустя 13 минут, 58 секунд (13.04.2009 - 13:08) sergeiss написал(а):
Если честно... То я не могу точно сказать, где ошибка. Потому как MySQL у меня нету.

Давай тогда по частям пробовать, отлаживать запрос, искать причину ошибки...
SQL
select *,

case
when substring_index( nomer_in,'/',1)>0 then 0
else cast (nomer_in as unsigned integer)
end
as ind

from mail order by ind


SQL
select *,

substring_index(nomer_in, '/',1) as ind

from mail order by ind


Спустя 3 часа, 53 минуты, 33 секунды (13.04.2009 - 17:01) Yulk написал(а):
Второй запрос выполнился, на первый та же ошибка : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'unsigned integer) end as ind from mail_in order by ind' at line 5

Спустя 1 час, 19 минут, 54 секунды (13.04.2009 - 18:21) Joker написал(а):
я попробовал у меня получилось))
Таблица:
SQL
--

CREATE TABLE `test` (
`id` int(10) NOT NULL auto_increment,
`t` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;

--
-- Дамп данных таблицы `test`
--

INSERT INTO `test` VALUES (1, '123');
INSERT INTO `test` VALUES (2, '123/1');
INSERT INTO `test` VALUES (3, '123/2');
INSERT INTO `test` VALUES (4, '123/9');
INSERT INTO `test` VALUES (5, '122/8');



Запрос
SQL
SELECT *
FROM `test` ORDER BY `t`


И отсортировалось как нужно.

Если так не помогает выложи табличку, чтоб можно было поэксперементировать с запросами

Спустя 2 часа, 25 секунд (13.04.2009 - 20:22) sergeiss написал(а):
Если у тебя будут только "122" и "123" с вариациями, то проблем нету smile.gif А ты попробуй внести величины "1", "10", "11", "3", "22", "123" и попробуй их отсортировать вот так вот, как ты сделал. Что получишь?
1, 10, 11, 123, 22, 3
А надо что?
1, 3, 10, 11, 22, 123

Да еще и надо учесть, что могут быть номера после слэша.

Так что тут нужно делать более сложную сортировку, о которой я говорил. Да и Yulk (Юля ?) не зря спрашивала.

Спустя 11 часов, 33 минуты, 20 секунд (14.04.2009 - 07:55) Yulk написал(а):
sergeiss
вот такой запрос выполнился
SQL
select *,
case
when substring_index( nomer_in,'/',1)>0 then 0
else 1
end
as ind
from mail order by ind

значит ошибка где-то здесь
SQL
cast (nomer_in as unsigned integer)

но тут вроде тоже все правильно???

Спустя 5 минут, 6 секунд (14.04.2009 - 08:00) Yulk написал(а):
Ну конечно, все дело просто в лишнем пробеле после cast biggrin.gif

Спустя 4 минуты, 17 секунд (14.04.2009 - 08:04) sergeiss написал(а):
Так я не понял - сейчас всё работает? Я имею ввиду мой запрос, в котором убран лишний пробел:
SQL
select *,

case
when substring_index( nomer_in,'/',1)>0 then cast( substring( nomer_in, 1, substring_index(nomer_in, '/',1)-1) as integer )
else cast(nomer_in as integer)
end
as ind

from mail order by ind

Спустя 12 минут, 17 секунд (14.04.2009 - 08:17) Yulk написал(а):
Нет, сработал запрос
SQL
select *,

case
when substring_index( nomer_in,'/',1)>0 then 0
else cast(nomer_in as unsigned integer)
end
as ind

from mail order by ind
, а в полном запросе опять ошибка

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select *, case when substring_index(nomer_in,'/',1)>0 then cast(substring(n' at line 2

Спустя 8 минут, 22 секунды (14.04.2009 - 08:25) sergeiss написал(а):
ОК. Получается, что мы разобрались, как работают CASE, substring_index, CAST (и что они вообще работают smile.gif). Остался только substring?

Попробуй этот запрос без КАСТа:
SQL
select *,

case
when substring_index( nomer_in,'/',1)>0 then substring( nomer_in, 1, substring_index(nomer_in, '/',1)-1)
else nomer_in end
as ind

from mail order by ind


PS. Опять же - может тут пробелы лишние где??? Поэкспериментируй, плз!

Спустя 5 минут, 59 секунд (14.04.2009 - 08:31) Yulk написал(а):
Все то же самое:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select *, case when substring_index(nomer_in,'/',1)>0 then substring(nomer_' at line 2

А что вообще делает
SQL
substring(nomer_in, 1, substring_index(nomer_in, '/',1)-1)
... не совсем поняла... почему 1?

Спустя 6 минут, 44 секунды (14.04.2009 - 08:38) sergeiss написал(а):
Цитата (Yulk @ 14.04.2009 - 08:31)
Все то же самое:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select *, case when substring_index(nomer_in,'/',1)>0 then substring(nomer_' at line 2

А что вообще делает
SQL
substring(nomer_in, 1, substring_index(nomer_in, '/',1)-1)
... не совсем поняла... почему 1?

Вот есть у тебя номер вида "1245/32"
substring_index(nomer_in, '/',1) находит положение первого (1) знака '/' и возвращает его. В данном случае вернет 5, а за вычетом единицы - 4.
substring выделяет часть строки, в данном случае
substring(nomer_in, 1, substring_index(nomer_in, '/',1)-1) должно выделить первые 4 знака из номера (4 начиная с первого), т.е. 1245.
После чего надо бы эту фигню преобразовать в целое число через CAST. Но это уже потом!
Попробуй убрать все пробелы внутри сабстринга:
SQL
select *,

case
when substring_index( nomer_in,'/',1)>0 then substring(nomer_in,1,substring_index(nomer_in,'/',1)-1)
else nomer_in end
as ind

from mail order by ind

Спустя 6 минут, 38 секунд (14.04.2009 - 08:44) sergeiss написал(а):
Сорри... Я тут тормознул немного smile.gif substring_index возвращает строку, а не положение этого знака!
Тогда запрос получается такой, вроде бы:
SQL
select *,

case
when substring_index( nomer_in,'/',1) > 0 then cast( substring_index(nomer_in, '/',1) as integer )
else cast(nomer_in as integer)
end
as ind

from mail order by ind

Спустя 7 минут, 26 секунд (14.04.2009 - 08:52) Yulk написал(а):
Ага, сама только что начала искать в справочнике и то же самое заметила smile.gif
Теперь все сработало, но в сортировке нечто странное:
145/1
145
145/2 huh.gif

Спустя 7 минут, 50 секунд (14.04.2009 - 09:00) sergeiss написал(а):
Цитата (Yulk @ 14.04.2009 - 08:52)
Ага, сама только что начала искать в справочнике и то же самое заметила smile.gif
Теперь все сработало, но в сортировке нечто странное:
145/1
145
145/2  huh.gif

А про это я говорил еще в самом начале smile.gif

В качестве самостоятельной работы предлагаю сделать второй индекс, по числу после '/', и сортировать по нему тоже.
Если слэша нету, то индекс сделай равным нулю.

Принцип тот же самый, что и для первого индекса. Даже функции те же самые smile.gif Только с параметрами поиграться надо немного.

Спустя 3 минуты, 13 секунд (14.04.2009 - 09:03) sergeiss написал(а):
И еще. Лучше использовать в сравнении не "substring_index( nomer_in,'/',1) > 0", а "length( substring_index( nomer_in,'/',1)) > 0".

Спустя 20 минут, 54 секунды (14.04.2009 - 09:24) Yulk написал(а):
Это что ли надо еще один case делать? или можно как-то в одном?

Спустя 6 минут, 9 секунд (14.04.2009 - 09:30) kirik написал(а):
Если еще нужно smile.gif

SQL
SELECT * FROM `test_n` ORDER BY ABS(`t`) ASC

или
SQL
SELECT * FROM `test_n` ORDER BY `t` + 0 ASC

отсортируют так:
3
10
11
100
120
128
128/3
128/2
128/1
1000
1050
1111

Таблица используется Joker'а.

Спустя 4 минуты, 42 секунды (14.04.2009 - 09:34) sergeiss написал(а):
Еще один КЕЙС надо. Структура его очень похожая будет, но другой нужен.

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

Спустя 10 минут, 56 секунд (14.04.2009 - 09:45) Yulk написал(а):
Каждый по отдельности CASE работает, вместе нет...что я еще напутала?
SQL
select *,

case
when substring_index( nomer_in,'/',1) > 0 then cast( substring_index(nomer_in, '/',1) as UNSIGNED integer )
else cast(nomer_in as UNSIGNED integer)
end
as ind
case
when substring_index( nomer_in,'/',-1) > 0 then cast( substring_index(nomer_in, '/',-1) as UNSIGNED integer )
else 0
end
as ind2

from mail order by ind, ind2

Ошибка
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'case when substring_index( nomer_in,'/',-1) > 0 then cast( substring_index(nome' at line 8

Спустя 4 минуты, 27 секунд (14.04.2009 - 09:50) kirik написал(а):
Цитата (sergeiss @ 14.04.2009 - 01:34)
kirik - может мюзикл так и отсортирует, кто его знает smile.gif Но, опять же, у тебя не совсем правильный порядок сортировки получился.

Сортирует smile.gif
Нужно
128
128/1
128/2
128/3

вместо
128
128/3
128/2
128/1
?

Спустя 50 секунд (14.04.2009 - 09:51) sergeiss написал(а):
Yulk - нужна запятая после 'as ind' smile.gif

А всё остальное (кроме отсутствия функции length()) выглядит очень даже правильно.

Спустя 2 минуты, 52 секунды (14.04.2009 - 09:54) sergeiss написал(а):
kirik - в частном случае, может, и получится как ты говоршь.

Но я предлагаю (на мой взгляд) более универсальное решение. Которое будет работать с любой БД (ну, может, только с точностью до написания имен функций). И при этом можно делать разделители разных видов, и их может быть несколько в номере (например, тройной номер 1/34/7 вполне можно отсортировать по моему алгоритму).

Спустя 7 минут, 33 секунды (14.04.2009 - 10:01) kirik написал(а):
sergeiss, cоглашусь что твой вариант более гибкий и универсальный.
Но если заранее известно что все значения будут вида N/N или просто N, то вполне прокатит более простой вариант smile.gif
SQL
SELECT * FROM `test_n` ORDER BY ABS(REPLACE(`t`, '/', '.')) ASC

тоесть
SQL
SELECT * FROM `mail` ORDER BY ABS(REPLACE(`nomer_in`, '/', '.')) ASC

для таблицы Yulkи

Спустя 1 минута, 55 секунд (14.04.2009 - 10:03) Yulk написал(а):
Ура, все работает как надо! biggrin.gif
Мне этот способ подходит, потому что в другой таблице номера вида
3-316-12/1
3-316-12/2
и их тоже надо будет сорировать...

sergeiss
спасибо большое за помощь!

Еще бы с постраничной навигацией с выводом номеров разобраться...

Спустя 3 минуты, 43 секунды (14.04.2009 - 10:07) kirik написал(а):
Цитата (Yulk @ 14.04.2009 - 02:03)
Мне этот способ подходит, потому что в другой таблице номера вида

а что это за данные, если не секрет? smile.gif

Спустя 3 минуты, 58 секунд (14.04.2009 - 10:11) sergeiss написал(а):
Цитата (Yulk @ 14.04.2009 - 10:03)
sergeiss
спасибо большое за помощь!

Еще бы с постраничной навигацией с выводом номеров разобраться...

Да не за что smile.gif

Насчет постраничной навигации тут на форуме была куча тем и ссылок на описания.

Спустя 1 минута, 47 секунд (14.04.2009 - 10:12) Yulk написал(а):
kirik
Это страшный секрет! smile.gif
А вообще-то просто номера исходящих писем...

Спустя 45 минут, 26 секунд (14.04.2009 - 10:58) Yulk написал(а):
Может подкажете еще чуток? Вот в этой же таблице после сортировки надо вывести наибольшее и наименьшее из сотни... С двойным запросом не хочется, поэтому если учесть что данные отсортированы в нужном порядке, надо просто взять первую и сотую запись?
запрос почти тот же:
SQL
select *,
case
when substring_index( nomer_in,'/',1) > 0 then cast( substring_index(nomer_in, '/',1) as UNSIGNED integer )
else cast(nomer_in as UNSIGNED integer)
end
as ind,
case
when substring_index( nomer_in,'/',-1) > 0 then cast( substring_index(nomer_in, '/',-1) as UNSIGNED integer )
else 0
end
as ind2
from mail_ style='color:green'>in order by ind DESC, ind2 DESC LIMIT $start, $num

а потом надо выбрать нужные значения... только вот тут у меня и не получается:
PHP
$nom mysql_query($query);
    if(!
$nomputerror("Ошибка при обращении к каталогу");
    while(
$nomer mysql_fetch_array($nom))
    {
$nom[] = $nomer['nomer_in'];}//в этой строчке выдает ошибку Сannot use a scalar value as an array
      
$nomer_min=$nom[0]; 
      
$nomer_max=$nom[100];echo "$nomer_min, $nomer_max <br>";


Не бросайте меня, пожалуйста, чуть-чуть доделать осталось smile.gif

Спустя 12 минут, 34 секунды (14.04.2009 - 11:10) sergeiss написал(а):
Во-первых, надо ДО цикла while объявить $num=array(); Тогда этой ошибки не будет (не должно быть).

Во-вторых... Индексы 0 и 100 подразумевают, что у тебя 101 элемент в массиве. Но ты делаешь лимит на 100 записей. Да еще их может быть меньше 100.
Поэтому... Для нахождения максимума-минимума внутри массива есть специальные функции. Названия их очень простые, каждое состоит из 3-х букв. Догадаешься сама, как их зовут? smile.gif

И в-третьих... Тебе надо выбирать из запроса не элементы 'nomer_in', а элементы 'ind'. Потому что первые - это строки, а последние, с таким трудом "выцарапанные" smile.gif нашими совместными усилиями как раз являются числами.

Спустя 26 минут, 31 секунда (14.04.2009 - 11:37) Yulk написал(а):
Да, теперь все как надо! Спасибо огромное! user posted image

Спустя 5 часов, 32 минуты, 56 секунд (14.04.2009 - 17:10) Yulk написал(а):
Эх, только сейчас когда все это "присобачила" куда надо, заметила, что сортирует все-таки неправильно... при обратной сортировке у меня выдает
145
144
144/2
144/1
143
...
вроде же при сортировке по вторму индексу ему ноль присваивается если нет дроби - должен вставать перед 1....

Спустя 1 час, 16 минут, 54 секунды (14.04.2009 - 18:27) Alchemist написал(а):
сорри что вмешиваюсь, но мне уже больно смотреть как вы мучаете мускуль smile.gif

ИМХО, вариант kirik`a с "ORDER BY ABS(" самый лучший на данный момент. И если уж так важна универсальность, то никто не заставляет использовать именно REPLACE().

Вот более универсальный вариант (для поля VARCHAR(10)):
SQL
SELECT * FROM `mail` ORDER BY RPAD(`nomer_in`, 10, ' ') DESC

Спустя 1 час, 30 минут, 21 секунда (14.04.2009 - 19:57) sergeiss написал(а):
Yulk - сделай вывод этих ind и ind2 рядом с основными значениями, посмотри, какие у них величины.

Alchemist - а теперь отсортируй, плз, по твоему алгоритму строки 3-23-3/4, 34-2-4/1, 4-2-1, 3-4-8/2. Что получишь?


Спустя 16 часов, 35 минут, 36 секунд (15.04.2009 - 12:33) Yulk написал(а):
Нда, действительно, там где нет дроби ind2 равен ind...

Спустя 20 минут, 29 секунд (15.04.2009 - 12:53) sergeiss написал(а):
Я еще раньше говорил: при получении ind2 вместо substring_index( nomer_in,'/',-1) > 0 напиши length( when substring_index( nomer_in,'/',-1) ) > 0

Должно помочь.

Спустя 57 минут, 30 секунд (15.04.2009 - 13:51) Yulk написал(а):
Так и стоит
SQL
select *,
case
when substring_index( nomer_in,'/',1) > 0 then cast( substring_index(nomer_in, '/',1) as UNSIGNED integer )
else cast(nomer_in as UNSIGNED integer)
end
as ind,
case
when length(substring_index( nomer_in,'/',-1)) > 0 then cast( substring_index(nomer_in, '/',-1) as UNSIGNED integer )
else 0
end
as ind2
from mail order by ind DESC, ind2 DESC LIMIT $start, $num

Спустя 8 минут, 53 секунды (15.04.2009 - 14:00) sergeiss написал(а):
Э....
У меня хоть и написано под аватаром Эксперт, но и другому человек думать тоже не повредит smile.gif

На самом деле там нужно другое условие. Потому что substring_index( nomer_in,'/',-1) при отсутствии слэша вернет на самом деле всю строку.
Тут надо, я думаю окончательно уже biggrin.gif biggrin.gif biggrin.gif , поставить условие
SQL
if locate('/', nomer_in) > 0 then cast ... и далее по старому тексту

Спустя 8 минут, 34 секунды (15.04.2009 - 14:08) Yulk написал(а):
А ведь и правда...
Никудышный из меня программист sad.gif
Но даже не думайте, не брошу, все равно буду этим заниматься и вас, экспертов, мучить tongue.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.