/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Forkert sortering af tal i mySql
Fra : Jakob Munck


Dato : 14-02-07 16:32

Jeg har en site, hvor medlemmerne skal listes efter vej og nummer. Men der
er noget galt, for når jeg forsøger at sortere efter nummer på vejen, så
bliver rækkefølgen forkert. Se her den forkerte rækkefølge:

Bjørnsonsvej 1
Bjørnsonsvej 10
Bjørnsonsvej 100
Bjørnsonsvej 101
Bjørnsonsvej 13
Bjørnsonsvej 14

Data ligger i mySql og min sql ser sådan ud:

$query = mysql_query ("SELECT * FROM fomedlemmer ORDER BY vej, nummer") or
die(mysql_error());

Jeg gør noget forkert, men jeg er ikke klar over hvad.

Hvem kan give et godt råd?

v.h.
Jakob Munck



 
 
Christoffer Kjeldgaa~ (14-02-2007)
Kommentar
Fra : Christoffer Kjeldgaa~


Dato : 14-02-07 16:37

Jakob Munck skrev:
> Hvem kan give et godt råd?

Du skal have fat i natsort()-funktionen:
http://www.php.net/manual/en/function.natsort.php

--
Christoffer Kjeldgaard Petersen
http://sappy.dk/

Johan Holst Nielsen (14-02-2007)
Kommentar
Fra : Johan Holst Nielsen


Dato : 14-02-07 16:47

Christoffer Kjeldgaard Petersen wrote:
> Jakob Munck skrev:
>> Hvem kan give et godt råd?
>
> Du skal have fat i natsort()-funktionen:
> http://www.php.net/manual/en/function.natsort.php

Det er bare et nasty at sortere dataene, især hvis det er datatunge
ting. Forestil dig 1.000.000 adresser der skal sorteres gennem en
natsort? Det vil ikke performancemæssigt være kønt - men det virker ved
små datamængder - ja :)


Mvh
Johan

Holst (14-02-2007)
Kommentar
Fra : Holst


Dato : 14-02-07 16:41


Jakob Munck wrote:

> Jeg har en site, hvor medlemmerne skal listes efter vej og nummer. Men der
> er noget galt, for når jeg forsøger at sortere efter nummer på vejen, så
> bliver rækkefølgen forkert. Se her den forkerte rækkefølge:
>
> Bjørnsonsvej 1
> Bjørnsonsvej 10
> Bjørnsonsvej 100
> Bjørnsonsvej 101
> Bjørnsonsvej 13
> Bjørnsonsvej 14
>
> Data ligger i mySql og min sql ser sådan ud:
>
> $query = mysql_query ("SELECT * FROM fomedlemmer ORDER BY vej, nummer") or
> die(mysql_error());
>
> Jeg gør noget forkert, men jeg er ikke klar over hvad.
>
> Hvem kan give et godt råd?

De behandler umiddelbart tallene som tekststrenge.

Prøv i stedet

$query = mysql_query ("SELECT * FROM fomedlemmer ORDER BY vej, nummer
ASC") or
die(mysql_error());

Johan Holst Nielsen (14-02-2007)
Kommentar
Fra : Johan Holst Nielsen


Dato : 14-02-07 16:46

Holst wrote:
> Prøv i stedet
>
> $query = mysql_query ("SELECT * FROM fomedlemmer ORDER BY vej, nummer
> ASC") or
> die(mysql_error());

Vil ingen ændring give at lave nummer som ASC - det betyder blot at den
skal sortere med "laveste værdi" først - modsat DESC. Du skal lave en
nummer+0 for at læse problematikken...

En anden mulighed er at lave nummer om til en INT - men det vil
formentlig på længere sigt give problemer hvis folk bor i 9A eller lign
(men det fixer +0 også ;)).

Mvh
Johan

Johan Holst Nielsen (14-02-2007)
Kommentar
Fra : Johan Holst Nielsen


Dato : 14-02-07 16:43

Jakob Munck wrote:
> Jeg har en site, hvor medlemmerne skal listes efter vej og nummer. Men der
> er noget galt, for når jeg forsøger at sortere efter nummer på vejen, så
> bliver rækkefølgen forkert. Se her den forkerte rækkefølge:
>
> Bjørnsonsvej 1
> Bjørnsonsvej 10
> Bjørnsonsvej 100
> Bjørnsonsvej 101
> Bjørnsonsvej 13
> Bjørnsonsvej 14
>
> Data ligger i mySql og min sql ser sådan ud:
>
> $query = mysql_query ("SELECT * FROM fomedlemmer ORDER BY vej, nummer") or
> die(mysql_error());
>
> Jeg gør noget forkert, men jeg er ikke klar over hvad.
>
> Hvem kan give et godt råd?

prøv med

$query = mysql_query ("SELECT * FROM fomedlemmer ORDER BY vej,nummer+0")
OR DIE(mysql_error());

mvh
johan


Jakob Munck (14-02-2007)
Kommentar
Fra : Jakob Munck


Dato : 14-02-07 17:19

>
> prøv med
>
> $query = mysql_query ("SELECT * FROM fomedlemmer ORDER BY vej,nummer+0")
> OR DIE(mysql_error());
>

Det virker perfekt og løser problemet. Tusind tak.

Nu spørger jeg så bare, hvilken forskel gør dette "+0" som får sorteringen
til at blive korrekt? Hvad sker der?

v.h.
Jakob



Michael Zedeler (16-02-2007)
Kommentar
Fra : Michael Zedeler


Dato : 16-02-07 07:48

Jakob Munck skrev:
>> prøv med
>>
>> $query = mysql_query ("SELECT * FROM fomedlemmer ORDER BY vej,nummer+0")
>> OR DIE(mysql_error());
>
> Det virker perfekt og løser problemet. Tusind tak.
>
> Nu spørger jeg så bare, hvilken forskel gør dette "+0" som får sorteringen
> til at blive korrekt? Hvad sker der?

Mysql konverterer implicit feltet til et tal. Jeg har lige et
tillægsspørgsmål: hvad hvis jeg bor på Bjørnsonsvej 1c?

Nummer to kommentar: Johans forslag løser dit problem, men det er i
hvert fald ikke SQL-kompatiblet. Den korrekte vej at gå, er at
konvertere til tal med en af de forhånden værende
talkonverteringsrutiner. Men husk så også hvorfor du i første omgang
valgte at bruge et tekstfelt(!). Det skal du fortsat også tage højde for.

Mvh. Michael.

--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Johan Holst Nielsen (16-02-2007)
Kommentar
Fra : Johan Holst Nielsen


Dato : 16-02-07 10:08

Michael Zedeler wrote:
>> Nu spørger jeg så bare, hvilken forskel gør dette "+0" som får
>> sorteringen til at blive korrekt? Hvad sker der?
>
> Mysql konverterer implicit feltet til et tal. Jeg har lige et
> tillægsspørgsmål: hvad hvis jeg bor på Bjørnsonsvej 1c?

Det vil fint fungere i MySQL... hvis det f.eks. er en varchar.

> Nummer to kommentar: Johans forslag løser dit problem, men det er i
> hvert fald ikke SQL-kompatiblet.

Well - nu har jeg kun testet på MySQL - ved ikke hvorledes f.eks.
PosgreSQL vil reagere det? Anyone?

> Den korrekte vej at gå, er at
> konvertere til tal med en af de forhånden værende
> talkonverteringsrutiner. Men husk så også hvorfor du i første omgang
> valgte at bruge et tekstfelt(!). Det skal du fortsat også tage højde for.

Der fald selv jeg af? Hvordan ville du lave løsningen her ellers? :) Er
vi ikke enige i f.eks. INT ikke er en mulighed pga. A,B,C osv efter tal?
Alternativt vil man selvfølgelig kunne ligge det i et selvstændigt felt
og så køre noget concat eller lign? men er imho heller ikke optimalt...

mvh
Johan

Mads Lie Jensen (16-02-2007)
Kommentar
Fra : Mads Lie Jensen


Dato : 16-02-07 11:25

On Fri, 16 Feb 2007 10:08:00 +0100, Johan Holst Nielsen
<spam@phpgeek.dk> wrote:

>> Nummer to kommentar: Johans forslag løser dit problem, men det er i
>> hvert fald ikke SQL-kompatiblet.
>
>Well - nu har jeg kun testet på MySQL - ved ikke hvorledes f.eks.
>PosgreSQL vil reagere det? Anyone?

gartn=> select 'hest 1' + 0;
ERROR: invalid input syntax for integer: "hest 1"

--
Mads Lie Jensen - mads@gartneriet.dk - ICQ #25478403
Gartneriet - http://www.gartneriet.dk/

Jakob Munck (16-02-2007)
Kommentar
Fra : Jakob Munck


Dato : 16-02-07 16:49

>
>> Nu spørger jeg så bare, hvilken forskel gør dette "+0" som får
>> sorteringen til at blive korrekt? Hvad sker der?
>
> Mysql konverterer implicit feltet til et tal. Jeg har lige et
> tillægsspørgsmål: hvad hvis jeg bor på Bjørnsonsvej 1c?
>

I dette tilfælde er det ikke et problem, da bogstaver står i et særligt
felt. Tallene står altså i et felot for sig selv. Og jeg har også prøvet at
konvertere tal-feltet til et INT-felt i mySql, men det gjorde ingen forskel.
Sorteringen var stadig forkert. Men med "+0" så virker det.

v.h.
Jakob





Johan Holst Nielsen (16-02-2007)
Kommentar
Fra : Johan Holst Nielsen


Dato : 16-02-07 20:17

Jakob Munck wrote:
>>> Nu spørger jeg så bare, hvilken forskel gør dette "+0" som får
>>> sorteringen til at blive korrekt? Hvad sker der?
>> Mysql konverterer implicit feltet til et tal. Jeg har lige et
>> tillægsspørgsmål: hvad hvis jeg bor på Bjørnsonsvej 1c?
>>
>
> I dette tilfælde er det ikke et problem, da bogstaver står i et særligt
> felt. Tallene står altså i et felot for sig selv. Og jeg har også prøvet at
> konvertere tal-feltet til et INT-felt i mySql, men det gjorde ingen forskel.
> Sorteringen var stadig forkert. Men med "+0" så virker det.

Well - nummeret kan ikke være for sig selv - hvis der er et medlem der
bor f.eks.

Vestergade 7B - vil du gå et problem med 7B i tilfælde af deu bruger
integer som datatype.

Mvh
Johan

Jakob Munck (16-02-2007)
Kommentar
Fra : Jakob Munck


Dato : 16-02-07 21:44

>
> Well - nummeret kan ikke være for sig selv - hvis der er et medlem der bor
> f.eks.
>
> Vestergade 7B - vil du gå et problem med 7B i tilfælde af deu bruger
> integer som datatype.
>

Ikke forstået. Hvis jeg har 7 stående i ét felt og B i et andet. Hvad er så
problemet?

v.h.
Jakob



Johan Holst Nielsen (16-02-2007)
Kommentar
Fra : Johan Holst Nielsen


Dato : 16-02-07 21:54

Jakob Munck wrote:
>> Well - nummeret kan ikke være for sig selv - hvis der er et medlem der bor
>> f.eks.
>>
>> Vestergade 7B - vil du gå et problem med 7B i tilfælde af deu bruger
>> integer som datatype.
>>
>
> Ikke forstået. Hvis jeg har 7 stående i ét felt og B i et andet. Hvad er så
> problemet?

Oh - okay forstod blot du havde Bjørnsonsvej stående i et felt - og 1
stående i et andet - troede blot du ville have problemer hvis det var 1B
så ;)

Well - i så fald burde en alm ORDER BY virke med korrekt sortering -
ellers vil jeg gerne se et tabel dump?

mvh
Johan

Jakob Munck (17-02-2007)
Kommentar
Fra : Jakob Munck


Dato : 17-02-07 16:32

>
> Well - i så fald burde en alm ORDER BY virke med korrekt sortering -
> ellers vil jeg gerne se et tabel dump?
>

Nej nu virker det, så jeg gider ikke gøre mere ved det. Mange tak for
hjælpen.

v.h.
Jakob



Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408518
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste