Avatar billede borupborup Nybegynder
02. januar 2007 - 10:49 Der er 14 kommentarer og
1 løsning

Sortering af Ip adresse fra DB

Lille problem:

Udtræk fra access database gir mig lidt problemer i forbindelse med sortering.

strSQL = "Select * from SERVER order by IP"

192.168.1.89
192.168.1.9
192.168.1.90
192.168.1.91


Hvordan for jeg den til at sortere korrekt?

/Thomas
Avatar billede fennec Nybegynder
02. januar 2007 - 10:58 #1
Del værdierne op i hver deres kolonne:
[SERVER]
IP, ip1, ip2, ip3, ip4
'192.168.1.89', 192, 168, 1, 89

Lav så en "... order by ip1, ip2, ip3, ip4"

Afhængig af hvilken database du bruger kan der også laves noget opdeling på punktumet så du slipper for de 4 ekstra tabeller.
Avatar billede jensgram Nybegynder
02. januar 2007 - 11:07 #2
Det kan gøres dynamisk. Nu skriver du ikke noget om hvilken DB du bruger, men hvis det er MySQL, så kig på http://mysql.org/doc/refman/4.1/en/string-functions.html

"Posted by [name withheld] on March 22 2006 8:02pm":

SELECT
`ip` ,
SUBSTRING_INDEX( `ip` , '.', 1 ) AS a,
SUBSTRING_INDEX(SUBSTRING_INDEX( `ip` , '.', 2 ),'.',-1) AS b,
SUBSTRING_INDEX(SUBSTRING_INDEX( `ip` , '.', -2 ),'.',1) AS c,
SUBSTRING_INDEX( `ip` , '.', -1 ) AS d
FROM log_table

-> Giver: ip, a, b, c, d (de respektive dele).

Virker med MySQL 3.23 og op. Andre databaser må have en tilsvarende funktion.
Avatar billede jensgram Nybegynder
02. januar 2007 - 11:08 #3
Iht. fennec:

SELECT
  ip,
  SUBSTRING_INDEX( `ip` , '.', 1 ) AS ip1,
  SUBSTRING_INDEX(SUBSTRING_INDEX( `ip` , '.', 2 ),'.',-1) AS ip2,
  SUBSTRING_INDEX(SUBSTRING_INDEX( `ip` , '.', -2 ),'.',1) AS ip3,
  SUBSTRING_INDEX( `ip` , '.', -1 ) AS ip4
FROM server
ORDER BY ip1, ip2, ip3, ip4
Avatar billede borupborup Nybegynder
02. januar 2007 - 11:30 #4
Min sql sætning ser sådan ud:

strSQL = "Select from Server Where IP LIKE '%" & Seek & "%'"

Hvordan passer jeg den til ovenstående?
PS.: det er en mdb database
Avatar billede fennec Nybegynder
02. januar 2007 - 11:33 #5
Altså en Access database??
(MS-SQL filerne hedder også mdb)
Avatar billede borupborup Nybegynder
02. januar 2007 - 11:33 #6
Det er en MS Access database
Avatar billede jensgram Nybegynder
02. januar 2007 - 11:57 #7
Med din LIKE:

strSQL = "
SELECT
  ip,
  SUBSTRING_INDEX( `ip` , '.', 1 ) AS ip1,
  SUBSTRING_INDEX(SUBSTRING_INDEX( `ip` , '.', 2 ),'.',-1) AS ip2,
  SUBSTRING_INDEX(SUBSTRING_INDEX( `ip` , '.', -2 ),'.',1) AS ip3,
  SUBSTRING_INDEX( `ip` , '.', -1 ) AS ip4
FROM server
WHERE ip LIKE '%" & Seek & "%'
ORDER BY ip1, ip2, ip3, ip4"


Er dog ikke klar over, om SUBSTRING_INDEX() er tilgængelig i Access. Desværre.
Avatar billede fennec Nybegynder
02. januar 2007 - 11:58 #8
strSQL = "Select from Server Where IP LIKE '%" & Seek & "%' order by int(left(IP,inStr(IP,'.')-1)), int(mid(IP,inStr(IP,'.')+1,inStr(IP,mid(IP,inStr(IP,'.')))-1)) , int(mid(mid(IP,inStr(IP,'.')+1),inStr(mid(IP,inStr(IP,'.')+1),'.')+1,inStr(mid(mid(IP,inStr(IP,'.')+1),inStr(mid(IP,inStr(IP,'.')+1),'.')+1),'.')-1)), int(mid(IP,inStrRev(IP,'.')+1))"
Avatar billede jensgram Nybegynder
02. januar 2007 - 11:58 #9
Desuden er der vist noget med, at linieskift i APS (.net eller hvad det nu er?) laves som:

strSQL = "..." &_
"..."

Men det ved jeg altså ikke noget som helst om :P
Avatar billede fennec Nybegynder
02. januar 2007 - 12:03 #10
Som du nok kan regne ud er denne metode lidt tung at afvikle, så der ryger noget performance. Du vil med fordel drage nytte af at opdele IP'en i 4 selvstændige kolonner, som jeg nævnte i første post.
Avatar billede borupborup Nybegynder
02. januar 2007 - 13:04 #11
Jeg tror jeg vil benytte fennec selvom jensgrams løsning nok er mere teknisk korrekt.
Avatar billede fennec Nybegynder
02. januar 2007 - 13:16 #12
borupborup >>
Vores løsninger er faktisk ens, selv om det ikke ser sådan ud. jensgram udnytter bare en funktion i MySQL, som ikke findes i Access (eller nogen anden database), Så den ene er ikke mere rigtig end den anden. Ville svare til at sige at a+=1 er mere rigtig end a=a+1. Nogle sprog har jo slet ikke += funktionen :o)

I Access har vi kun left/right/mid/inStr funktionerne at arbejde med, som jeg har brugt til at opdele IP med. Også har Access heller ikke mulighed for at bruge alias i "order by" hvorfor det ikke kan stå på selectlisten.
Avatar billede fennec Nybegynder
02. januar 2007 - 13:18 #13
og et svar
.o) <-- One Eyed Jack

Jeg vil dog endnu engang opfordre dig til at ændre databaseopbygningen så du deler IP'en op i 4 selvstændige tabeller. Det er den bedste løsning (performansemæssig), lige meget hvilken database man bruger.
Avatar billede fennec Nybegynder
02. januar 2007 - 13:20 #14
Rettelse:
Det er selvfølgelig 4 selvstændige kolonner... Ikke tabeller :o)
Avatar billede jensgram Nybegynder
02. januar 2007 - 13:31 #15
02/01-2007 13:16:45 > Præcis - det er ren syntax. Håber andre kan bruge løsningen, da mit manglende kendskab til Access var en begrænsning ;P
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester