Stránka 1 z 1

SQL řazení dle IP s maskou

Napsal: 24 Oct 2018 19:25
od svestka
Máme vlastní systém postavený na PHP+MySQL a řešíme jednu věc ...

Seznamy IP adres řadíme ... "ORDER BY INET_ATOM(IP)" což ale nefunguje dobře s maskou, která je občas bohužel součástí sloupce "ip" a občas je zase zvlášť. No jako u debilů :)

Nemáte na to někdo vychytanou fci v PHP, které předám pole, které je směsicí IP a IP/maska a ona si s tím poradí?
třeba
192.168.1.20
192.168.1.3
192.168.1.16/30

Díky.

Re: SQL řazení dle IP s maskou

Napsal: 24 Oct 2018 19:42
od cerva

Kód: Vybrat vše

$arr = array("192.168.1.20", "192.168.1.3", "192.168.1.16/30");
natsort($arr);
print_r($arr);

Array
(
    [1] => 192.168.1.3
    [2] => 192.168.1.16/30
    [0] => 192.168.1.20
)


Systemove ale je samozrejme drzet homogenitu dan v jednom sloupci : )

Re: SQL řazení dle IP s maskou

Napsal: 24 Oct 2018 20:51
od hapi
no jo ale to ty data musíš nejdřív načíst a až pak srovnat. V případě že to je složitější zápis tak musíš vracet data zpět to mysql.

Nebylo by lepší mít na subnet solo sloupec? můžeš ho používat na sortování a pak mít v selectu třeba "SELECT CONCAT(ip, '/', subnet) As address" a ten ukazovat.

Re: SQL řazení dle IP s maskou

Napsal: 24 Oct 2018 21:08
od Myghael
V naší aplikaci to přesně tak máme, v jednom sloupci IP, v druhém subnet. Pokud chci uložit jen jednu IP adresu, prostě se zadá 32 (jakože /32). Tady ty přepočty ale obstarává PHP část. Má to tu výhodu, že se s tím výborně počítá a navíc se to dá naprosto stejně použít pro IPv4 i IPv6.

Doporučil bych tedy přidat sloupec pro subnet a pak už je to o skriptu, který v každém řádku vezme tu adresu jako string a hledá v ní "/" (lomítko). Pokud nenajde, uloží subnet 32 a adresu nechá být. Pokud najde, uloží adresu samotnou a číslo za lomítkem uloží jako subnet (doporučuji přidat ověření, že tam nebude třeba /48 pro IPv4 a podobně), případně provede přepočet, pokud za tím lomítkem najde třeba 255.255.255.0 - přesně takový skript někde mám, jen ty řádky načítá z textového souboru namísto databáze (používal se při importu do databáze) - jestli ho najdu, hodím ho sem. Vrchol efektivity to není, ale na jednorázový import (případně občasný úklid) vyhovuje.

Re: SQL řazení dle IP s maskou

Napsal: 24 Oct 2018 21:18
od Standula
A modří vědí, že použijí postgres https://www.postgresql.org/docs/9.3/static/functions-net.html

Re: SQL řazení dle IP s maskou

Napsal: 24 Oct 2018 22:12
od Myghael
Vskutku, ale dotaz byl na MySQL.

Re: SQL řazení dle IP s maskou

Napsal: 24 Oct 2018 22:22
od ludvik
Pravdu má předřečník - každý sloupec v DB má být takový, aby už nešel rozdělit. Tak jako se blbě třídí (a vlastně i prohledává) sloupec JMENO_PRIMENI, stejně blbý je způsob IP/MASKA.
Čili bych v prvé řadě přistoupil k oddělení těchto informací.
No a po oddělení je dobré si uvědomit, že maska k IP adrese uživatele prostě nepatří. Ta patří segmentu, kam je připojen. Čili je to vazba k evidenci něčeho jiného - třeba síťového rozhraní routeru.

Třídění podle funkce nebude zrovna optimální. IP adresa je prostě číslo - zapisovat do DB jeho prezentační tvar je většinou hloupost. Od toho jsou číselné typy.

Re: SQL řazení dle IP s maskou

Napsal: 24 Oct 2018 23:42
od cerva
ludvik píše:Pravdu má předřečník - každý sloupec v DB má být takový, aby už nešel rozdělit. Tak jako se blbě třídí (a vlastně i prohledává) sloupec JMENO_PRIMENI, stejně blbý je způsob IP/MASKA.
Čili bych v prvé řadě přistoupil k oddělení těchto informací.
No a po oddělení je dobré si uvědomit, že maska k IP adrese uživatele prostě nepatří. Ta patří segmentu, kam je připojen. Čili je to vazba k evidenci něčeho jiného - třeba síťového rozhraní routeru.

Třídění podle funkce nebude zrovna optimální. IP adresa je prostě číslo - zapisovat do DB jeho prezentační tvar je většinou hloupost. Od toho jsou číselné typy.

Přesně tak, jediné správné řešení je dodržovat při návrhu DB databázové formy (https://cs.wikipedia.org/wiki/Normalizace_databáze). Na druhou stranu není vždy efektivní měnit DB model už existujícího systému, pokud potřebujeme jen nějakou jednorázovou drobnost navíc - pak bych se klonil klidně k použití toho natsort(). Používání specifického datového typu na uložení IP adresy zní jako fajn nápad - pokud se v budoucnu nebude řešit migrace mezi DB (třeba MariaDB -> Postgress).

Re: SQL řazení dle IP s maskou

Napsal: 25 Oct 2018 09:56
od k3dt
IP urcite ukladat jako int unsigned a masku zvlast.. usetrite si hodne starosti i nejakej ten vykon.

ale muzete to vyprasit pres:

Kód: Vybrat vše

ORDER BY INET_ATON(SUBSTRING_INDEX(segment,'/',1))

Re: SQL řazení dle IP s maskou

Napsal: 05 Nov 2018 16:26
od svestka
k3dt píše:IP urcite ukladat jako int unsigned a masku zvlast.. usetrite si hodne starosti i nejakej ten vykon.

ale muzete to vyprasit pres:

Kód: Vybrat vše

ORDER BY INET_ATON(SUBSTRING_INDEX(segment,'/',1))


Vypraseno ... funguje ... diky.