Avatar billede pissed_squirrel Nybegynder
27. december 2010 - 23:56 Der 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

Nogle som har mod på at hjælpe mig?

På forhånd tak
Avatar billede arne_v Ekspert
28. december 2010 - 00:42 #1
Kan du give eksempel på data og hvordan de skal sorteres?
28. december 2010 - 09:18 #2
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
Avatar billede pissed_squirrel Nybegynder
28. december 2010 - 09:54 #3
@arne_v
Data ser således ud:

Disney's klassiker 1
Disney's klassiker 2
...
Disney's klassiker 49

Jeg kunne så godt tænke mig at den sorterer det efter normal nummer orden, men den skriver det sådan her:

Disney's klassiker 1
Disney's klassiker 10
Disney's klassiker 11
Disney's klassiker ...
Disney's klassiker 19
Disney's klassiker 2
Disney's klassiker 20
Disney's klassiker 21
...


@Christian_Belgien
Jeg kan jo ikke få MySQL til at bruge den PHP funktion ;)
28. december 2010 - 11:14 #4
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.
Avatar billede pissed_squirrel Nybegynder
28. december 2010 - 12:33 #5
@Christian_Belgien

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.
Avatar billede arne_v Ekspert
29. december 2010 - 00:39 #6
Jeg er ikke i tvivl om at den rigtige løsning er flere felter. Med den ønskede logik er en felt værdi ikke atomisk.

Jeg kan ikke se nogen praktisk måde at kode den ønskede logik i SQL på. MySQL's string funktioner har ikke den nødvendige funktionalitet.

Hvis man *virkeligt* ønsker det, så kan man skrive en user defined funktion i C og loade den i ens MySQL.

Det kræver naturligvis fuld adgang til serveren.
29. december 2010 - 10:41 #7
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.
Avatar billede pissed_squirrel Nybegynder
29. december 2010 - 12:32 #8
@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?
Avatar billede pissed_squirrel Nybegynder
29. december 2010 - 12:34 #9
@Chrsitian_Belgien
Du kan også godt få nogle point, hvis du lyster?
Avatar billede arne_v Ekspert
29. december 2010 - 20:58 #10
Hvis det ikke er store data mængder, så bør det være meget hurtigt at sortere i PHP.
Avatar billede arne_v Ekspert
29. december 2010 - 20:59 #11
Point? Det er jo ikke meget jeg har bidraget med. Men hvis du vil.
29. december 2010 - 21:39 #12
Ok, svar fra mig.
30. december 2010 - 09:15 #13
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:

<?
include("connect.php");
$result = mysql_query("SELECT catnumber FROM Stock WHERE id <= 10")or die(mysql_error());
while($row = mysql_fetch_array($result)) $a[] = $row[0];
print_r ($a);
echo "<br>";
asort($a);
print_r ($a);
echo "<br>";
natsort ($a);
print_r ($a);
echo "<br>";
?>

fik jeg dette resultat:

Array ( [0] => 222 [1] => 456 [2] => 789 [3] => 34B [4] => 56C [5] => 78D [6] => 112 [7] => 223 )
Array ( [6] => 112 [0] => 222 [7] => 223 [3] => 34B [1] => 456 [4] => 56C [2] => 789 [5] => 78D )
Array ( [3] => 34B [4] => 56C [5] => 78D [6] => 112 [0] => 222 [7] => 223 [1] => 456 [2] => 789 )

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.
30. december 2010 - 09:27 #14
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:

Array ( [0] => 12abc [1] => 2abcd [2] => a12bc [3] => a2bcd [4] => 3abc2 [5] => abcd12 [6] => abcde2 )
Array ( [0] => 12abc [1] => 2abcd [4] => 3abc2 [2] => a12bc [3] => a2bcd [5] => abcd12 [6] => abcde2 )
Array ( [1] => 2abcd [4] => 3abc2 [0] => 12abc [3] => a2bcd [2] => a12bc [5] => abcd12 [6] => abcde2 )
Avatar billede pissed_squirrel Nybegynder
30. december 2010 - 13:55 #15
Tror jeg splitter strengen op i bogstaver og tal, erstater tallet med #, så kan jeg nemt se efterfølgende hvor tallet skal stå
Avatar billede pissed_squirrel Nybegynder
30. december 2010 - 17:05 #16
Hmm, det der med at splitte strengen op, det var ikke helt så let som jeg havde regnet med.

Jeg har følgende stump kode

$string = "The number 123456789 is positive and -9876543210 is negative";

echo preg_replace("/[-0-9]/", "#", $string);


Resultatet er følgende:

The number ######### is positive and ########### is negative

Jeg kunne dog godt tænke mig at der kun blev indsat 1 # pr. talstreng der blev fjernet.

Dvs. resultatet kunne jeg godt tænke mig så sådan her ud:

The number # is positive and # is negative

Nogle af jer der har styr på den?
31. december 2010 - 05:34 #17
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.
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