Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Работа с IP


Автор: MAKCim 8.10.2009, 18:34
есть таблица, один из столбцов содержит IP адрес (обычный INTEGER, но порядок байт - сетевой)
нужно получить все записи таблицы, просортированные по IP, но с т. з. символьного представления IP
т. е.
1.10.256.7
1.11.0.1
2.0.0.0
2.0.1.0
2.0.2.255
и т. д.

Автор: rthsobakas 8.10.2009, 20:50
если бы просто тип integer то можно так 
select * from TABLE  order by IP DESC
или так по возрастанию  и убыванию
select * from TABLE  order by IP ASC

Цитата

обычный INTEGER, но порядок байт - сетевой

Что такое байт сетевой?
FFFFFFFF типо из integer вычлиняете байты?

Автор: Akina 8.10.2009, 20:53
Ну конвертируй свои сетевые байты в "т.н. символьное представление" с ведущими нулями и сортирь по нему.

Автор: MAKCim 8.10.2009, 22:02
мне нужно получить не строки (к тому же сортировка строк будет работать очень медленно для большой таблицы) а данные из таблицы как есть, но в порядке убывания/возрастания IP

Автор: Akina 8.10.2009, 22:10
Значит, преобразуй "сетевые" байты в нормальные.

Цитата(MAKCim @  8.10.2009,  23:02 Найти цитируемый пост)
к тому же сортировка строк будет работать очень медленно для большой таблицы

Ты вообще о чём? у тебя нет НИКАКИХ шансов пройти мимо filesearch без изменения структуры таблицы! так что забудь про мелочи.

Добавлено через 1 минуту и 10 секунд
Цитата(MAKCim @  8.10.2009,  23:02 Найти цитируемый пост)
мне нужно получить не строки 

Да получай! хоть два раза! я говорю по чём сортировать... не надо - ну не выводи выражение сортировки в конечный набор.

Автор: skyboy 8.10.2009, 22:46
Цитата(MAKCim @  8.10.2009,  17:34 Найти цитируемый пост)
обычный INTEGER, но порядок байт - сетевой

в смысле, http://dev.mysql.com/doc/refman/5.1/en/miscellaneous-functions.html#function_inet-ntoa будет работать нормально?
может, сразу два поля держать - одно для сортировки и одно для выдачи? записывая одно, править триггером другое?

Автор: DimW 9.10.2009, 08:20
Цитата(skyboy @  8.10.2009,  22:46 Найти цитируемый пост)
может, сразу два поля держать

а мускул что по функции сортировать не умеет?
вариант:
Код

select * 
  from table_ip t
order by my_function_convert_ip(t.ip)

Автор: Akina 9.10.2009, 08:30
Цитата(DimW @  9.10.2009,  09:20 Найти цитируемый пост)
а мускул что по функции сортировать не умеет?

Умеет, умеет... но это filesearch. Я уже об этом говорил...

Автор: DimW 9.10.2009, 08:59
Цитата(Akina @  9.10.2009,  08:30 Найти цитируемый пост)
но это filesearch

а индекс по функции в мускуле создать нельзя? 
в доке что то не нашел... :(

Автор: skyboy 9.10.2009, 09:20
Цитата(DimW @  9.10.2009,  07:59 Найти цитируемый пост)
а индекс по функции в мускуле создать нельзя? 

насколько мне известно - нет.

Автор: Akina 9.10.2009, 09:41
Цитата(DimW @  9.10.2009,  09:59 Найти цитируемый пост)
а индекс по функции в мускуле создать нельзя? 

 smile А где можно?

Автор: DimW 9.10.2009, 10:45
Цитата(Akina @  9.10.2009,  09:41 Найти цитируемый пост)
 А где можно? 

есть в оракле, постгрессе и скорей всего в mssql и в db2.

Автор: Akina 9.10.2009, 10:52
В MS SQL нет. Но можно создать индекс по вычисляемому полю (с некоторыми ограничениями, конечно).
Код

CREATE TABLE t1 (a int, b int, c AS a*b)
GO
CREATE UNIQUE CLUSTERED INDEX Idx1 ON t1.c
GO

Автор: DimW 9.10.2009, 10:53
Цитата(skyboy @  9.10.2009,  09:20 Найти цитируемый пост)
насколько мне известно - нет. 

жаль :(

Автор: DimW 9.10.2009, 11:59
извиняюсь за уход в оффтоп но не спросить не могу.

Цитата(Akina @  9.10.2009,  10:52 Найти цитируемый пост)
Но можно создать индекс по вычисляемому полю 


Akina, я правильно понимаю (делаю вывод из примеров в документации) что в mssql вычислимое поле на основе собственной функции сделать нельзя?

Цитата(Akina @  9.10.2009,  10:52 Найти цитируемый пост)
с некоторыми ограничениями, конечно

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

Автор: Akina 9.10.2009, 12:08
Признаться, не пробовал... MSDN молчит как партизан. Но с учётом того что UDF не может быть permanent-deterministic - думаю, что нельзя.

Автор: skyboy 9.10.2009, 12:10
Цитата(DimW @  9.10.2009,  10:59 Найти цитируемый пост)
и при одних и тех же значениях параметров, в любой момент времени, должна возвращать одинаковое значение

это называется "http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B8%D0%B7%D0%BC". и, кстати, в mysql при определении функции можно указатьб deterministic она или нет. полезно для оптимизатора, видимо.

Автор: DimW 9.10.2009, 12:28
Цитата(skyboy @  9.10.2009,  12:10 Найти цитируемый пост)
это называется "детерминизмом".

да, спасибо, коротко и ясно smile

Цитата(skyboy @  9.10.2009,  12:10 Найти цитируемый пост)
кстати, в mysql при определении функции можно указатьб deterministic она или нет

в оракле данную прагму необходимо указывать для функций  на основе которых делается индекс - выглядет это со стороны разработчика примерно так - "мамой клянусь что детерминированная"  smile

Цитата(Akina @  9.10.2009,  12:08 Найти цитируемый пост)
 думаю, что нельзя

скорей всего так и есть.
 
Akina, skyboy, спасибо за ответы.

MAKCim, прошу прощенье за то что влез со своими "избалованными" вариантами. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)