Avatar billede redlaz Nybegynder
04. marts 2011 - 19:05 Der er 13 kommentarer og
1 løsning

Problemer med sortering af varchar

Hej med jer,

Jeg har et problem.

Jeg har følgende mysql linie "SELECT * FROM tabel WHERE billednavn < '$row[billednavn]' AND id_album = '$id_album' ORDER BY length(billednavn),billednavn DESC";"

Jeg henter næste linie ud fra databasen som indeholder dato om et  billede. Det virker sådan set også fint, men jeg har et problem med sortering.

F.eks så kommer billednavn90.jpg efter billednavn9.jpg

Ved blot at hive alle data ud så virker sortering med length uden problemer. Men idet jeg benytter <> så går det galt.

Jeg håber at jeg forklarer mig ordentligt. Det er mit første indlæg :)

feltet er af typen VARCHAR da det bruges til filnavnet og indeholder bogstaver og numre. Problemet består i sortering ved numrene. Så istedet for at springe fra f.eks test9 til test10, så går den fra test9 til test90

Hvad kan jeg gøre?
Avatar billede arne_v Ekspert
04. marts 2011 - 19:22 #1
En meget oplagt ,ulighed var at kalde billederne:

test0009.jpg
test0010.jpg
Avatar billede arne_v Ekspert
04. marts 2011 - 19:23 #2
mulighed
Avatar billede redlaz Nybegynder
04. marts 2011 - 19:59 #3
Ja jeg har overvejet at omdøbe, men har egentligt haft et ønske om at bevare  det originale filnavne af diverse årsager.

Nogen der har et bud?
Avatar billede redlaz Nybegynder
04. marts 2011 - 19:59 #4
Og desuden er det meget forskelligt hvad filerne hedder.
04. marts 2011 - 20:28 #5
Du oensker, saa vidt jeg forstaar, at tekststrenge der indholder talvaerdier skal sorteres 'naturligt' saaledes at 'a1b', 'a2b', og 'a10b' bliver sorteret i denne orden og ikke i tekststrengorden 'a1b', a10b, og 'a2b'.

Jeg har god erfaring med php's natsort() funktion der goer precist dette.  Her er en reference:

http://www.w3schools.com/PHP/func_array_natsort.asp
Avatar billede redlaz Nybegynder
04. marts 2011 - 21:14 #6
Ja men det gør jeg allerede ved at benytte length i ORDER BY. Men Idet jeg benytter mig af > eller < så går det galt....

Ved f.eks. kun at vise billederne som i galleri, så fungerer det uden problemer. Jeg bruger denne funktion i en navigationsrude, så den skal vælge næste eller forrige billede, sorteret på navn, men så opstår problemet igen med det omtalte nummer sortering :(
04. marts 2011 - 22:21 #7
Jeg tror vi snakker forbi hinanden.  Tilgiv mig hvis jeg tager fejl, men jeg opfatter at grundproblemet i spoergsmaalet er dette: 'tekst'strenge der indeholder baade bogstaver og tal sorteres alfabetisk saaledes at for eksempel 10 kommer foer 9.  Hvis man oensker at sortere vaerdierne saa bogstaverne kommer i alfabetisk men tallene i numerisk raekkefoelge, altsaa 'a9b' foer 'a10b' forsoeger man ofte en masse krumspring saasom order by length.  Men alt det kan man springe over ved at bruge funktionen natsort() som netop goer dette, bogstaver alfabetisk, tal numerisk.

Jeg lavede lige denne demonstration (som du kan se paa http://christianjorgensen.be/redlaz.php ):

Denne tabel:

CREATE TABLE redlaz(billednavn VARCHAR(20));

INSERT INTO redlaz VALUES('billednavn9.jpg');
INSERT INTO redlaz VALUES('billednavn22.jpg');
INSERT INTO redlaz VALUES('billednavn101.jpg');

og denne kode hvor jeg traekker vaerdierne ud, placerer dem i $array som jeg foerst sort($array) og derefter natsort($array) saaledes:

$result = mysql_query("SELECT * FROM redlaz");
while($row = mysql_fetch_array($result)) $array[] = $row['billednavn'];
sort($array);
echo "SORT <br>";
foreach($array as $value) echo "$value <br>";
natsort($array);
echo "NATURLIG SORT <br>";
foreach($array as $value) echo "$value <br>";

med dette resultat:

SORT
billednavn101.jpg
billednavn22.jpg
billednavn9.jpg
NATURLIG SORT
billednavn9.jpg
billednavn22.jpg
billednavn101.jpg
Avatar billede redlaz Nybegynder
04. marts 2011 - 23:00 #8
OK, jeg håbede blot at jeg kunne lave et tricky mysql query frem for at sortere via PHP. Men det lyder til at jeg ikke kan få mit ønske opfyldt med mysql direkte?
04. marts 2011 - 23:03 #9
Saa snakker vi stadig forbi hinanden.  Jeg mente at jeg havde demonstreret en php loesning.  Men jeg har aabenbart misforstaaet problemet.  Maaske vil du forklare hvor jeg gaar forkert i byen.
04. marts 2011 - 23:04 #10
Undskyld, jeg laeste forkert.  Nej, jeg kender ingen sql loesning, man er noed til at ty til php, men der virker det da ogsaa upaaklarligt.
Avatar billede redlaz Nybegynder
04. marts 2011 - 23:05 #11
Desuden klarer jeg umiddelbart allerede din kode i eet mysql query, hvilket også er fint når jeg f.eks udlæser alle billeder i et galleri i alfabetisk-numerisk orden.

Det er udelukkende når jeg vil have forrige eller næste værdi i rækken, som passer i forhold til alafabetisk-numerisk sorteret.
Avatar billede redlaz Nybegynder
04. marts 2011 - 23:08 #12
Det er helt ok :)
06. marts 2011 - 22:32 #13
redlaz, forventer du flere indlaeg paa denne traad eller soeger du yderligere oplysninger?  I saafald forklar.  Hvis ikke, saa maa du lukke traaden.

Jeg kan se at dette er dit foerste spoergsmaal paa Eksperten, saa jeg forklarer (maaske til overflod) at naar et spoergsmaal ikke laengere er aktivt skal det lukkes ved at spoergeren accepterer et svar, et indlaeg markeret med gult.  Man accepterer et svar ved at saette et 'flueben' i firkanten ved 'Accepter dette svar' og derefter klikke paa feltet 'Accepter svar og afgiv points'.

Du soegte i dit spoergsmaal efter en maade at sortere billednavnene i mysql uden brug af php som foreslaaet i indlaeg #7 og uden at tilpasse navnene som foreslaaet i #1.  Det fik du ingen loesning paa.  Du kan derfor vaelge at acceptere det svar du selv oprettede, #8 (altsaa klik i firkanten og derefter i 'Accepter svar og afgiv points').  Det er den simpleste maade at lukke spoergsmaalet paa.

Alternativt kan du erkende at indlaeggene var hjaelp til at udelukke ikke-loesninger.  I saa fald maa du acceptere svar fra de der kom med indlaeggene.  Jeg opretter dette som et svar, og du kan bede det andet medlem der kom med indlaeg om ogsaa at oprette et svar.

Men under alle omstaendigheder enten forklar hvad mere du forventer eller tag skridt til at luk spoergsmaalet.  Lad det ikke blive haengende.  Please.
Avatar billede redlaz Nybegynder
06. marts 2011 - 22:37 #14
Hej igen. Det skal jeg hurtigt gøre. Jeg beklager.
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
Computerworld tilbyder specialiserede kurser i database-management

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