27. december 2010 - 23:56Der er
15 kommentarer og 2 løsninger
Sortering af VarChar med numre i
Hej Eksperter
Jeg har et felt af typen varchar og når jeg prøver at sortere det sådan at 10 kommer efter 9 så er den bare dum
Jeg har både text og numre i det felt og det er jo derfor jeg ikke kan bruge INT som datatype.
Jeg har prøvet at bruge "SORT BY 0+" men det virker ikke, og den er fuldstændig lige glad med om jeg bruger ASC eller DESC når jeg bruger 0+.
Jeg har prøvet at finde en løsning på Google, men kan kun finde folk med lignende problemer, hvor de har kunne løse det med 0+, men det virker som skrevet ikke hos mig.
Jeg bruger MySQL 5.1.37 på Apache/2.2.12 (Win32) DAV/2 mod_autoindex_color PHP/5.3.0 som gør brug af mysqli som extension
Jeg skal selv til at rode med det i en hjemmeside jeg er ved at udvikle (sortere objekter i katalognummer raekkefoelge hvor katalognumrene, ligesom gadenumre, kan indeholde bogstaver saasom 127B.) I min googling opdagede jeg at det normalt kaldes 'natural sort' og at der er en php funktion natsort der burde virke. Jeg har ikke (endnu) testet det selv, men her er for eksempel et link: http://php.net/manual/en/function.natsort.php
Jamen saa lurekikker jeg her for at se om der fremkommer en loesning jeg kan bruge. ()Jeg forsoegte mig, forresten, med i database tabellen at lave to kolonner for katalognummer, en numerisk og en alfabetisk saaledes at nummer 17 kun brugte den numeriske kolonne og 17B brugte begge kolonner. Saa kunne jeg sortere med ...order by catnumber, catletter,.... og det virkede, men det var for besvaerligt at arbejde med naar der skulle indsaettes nye objekter med katalognumre.
Den løsning har jeg også overvejet, men da jeg ikke kan være sikker på at tallet vil være samme sted alle gange, dvs. tallet kan også være i starten eller i midten, i stedet for i slutningen, som jeg har nu, så syntes jeg ikke det er en ordentlig løsning, og den vil kræve en del mere programmering når der skal indsættes data.
Nu var jeg meget haengt op i gaar og er ogsaa idag. Da jeg sendte #2 fattede jeg ikke at du snakkede om en mysql loesning, derfor gav jeg dig et link til en php loesning fordi det er det jeg selv skal til at bruge og derfor havde googlet paa, og da jeg sendte #4 var jeg lige paa vej ud af doeren og fangede heller ikke at du sagde at natsort ikke virker i mysql.
Jeg kender heller ikke nogen mysql loesning paa 'natural sort.' Det med at tilfoeje + har jeg faaet til at virke i mysql, men kun hvis det drejer sig om tekststrenge der indeholder udelukkende tal. Ellers har det ingen virkning.
Men hvordan skal du anvende resultatet af din query? Hvis du anvender resultatet i en php applikation kunne loesningen saa ikke vaere at putte det u-sorterede resultat af queryen i en array og derefter i php sortere arrayen ved hjaelp af natsort? Det er det jeg selv har i tanker naar jeg, forhaabenlig om en uges tid, faar tid.
@arne_v Jeg har desværre ikke fuld adgang til serveren, så jeg må vidst til at være lidt kreativ med PHP, desværre, da det ikke vil være lige så hurtigt som at få MySQL til at sortere for mig.
@Christian_Belgien Problemet er ikke det at skulle trække det ud af query og så lege rundt med det i PHP, det er nu mere det at det vil være langsommere end at få MySQL til at sortere det direkte når den nu har fat i det.
Kan godt se at løsningen så må blive enten at lave flere felter i DB eller at sortere bag efter i PHP.
@arne_v Vil du have nogle point for at hjælpe mig på rette vej?
Men natsort virker, i det mindste hvis det drejer sig om tekststrenge der altid begynder med talvaerdier og derefter kan indeholde bogstaver. Med denne kode:
Som det fremgaar af koden viser den foerste array de raa data, den anden array dataerne sorteret alfabetisk, altsaa for eksempel 34B stoerre end 223, og den tredje array 'natsorted' hvor der sorteres som oenskes.
Maaske virker det ogsaa i dit eksempel hvor tekststrengene ikke noedvendigvis begynder med tal. Jeg ville vaere interesseret i resultatet.
Jeg var for nysgerrig til at vente, saa jeg lavede en tabel med strenge med blanding af tal og bogstaver. Der virker natsort ogsaa. Med samme kode som ovenfor undtagen med query paa den nye tabel faar jeg dette resultat:
Du oprettede et spoergsmaal i kategorien mysql som du fik svar paa, eller maaske rettere feed-back til. Feed-backen fik dig til at omformulere problemetstillingen saa du nu har brug for hjaelp i retning af regular expressions. Jeg vil foreslaa at du til den ende opretter et nyt spoergsmaal i den rette kategori saa det ses af alle ekspertens medlemmer i stedet for at taerske langhalm paa et allerede afsluttet spoergsmaal i en anden kategori.
Synes godt om
Ny brugerNybegynder
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.