Avatar billede kthiesen Novice
24. juni 2011 - 06:51 Der er 6 kommentarer og
1 løsning

MySQL order by virker ikke med streng

Hej

Jeg har en MySQL database, hvor jeg ønsker at sortere på denne type streng:

Assens-2011-1
Assens-2011-4
Assens-2011-2
Assens-2011-3
.
.
Assens-2011-101
.
.
Assens-2011-201

Det skal sortere på den sidste del af strengen:

Assens-2011-1
Assens-2011-2
Assens-2011-3
Assens-2011-4
..
Assens-2011-101
Assens-2011-102
..
Assens-2011-201
Assens-2011-202

osv.

Lige nu sorterer den således:

Assens-2011-1
Assens-2011-11
Assens-2011-12
...
Assens-2011-2
Assens-2011-21
Assens-2011-201

Hvad er der galt i min ORDER BY_

ORDER BY ASCII(by)+0, by ASC
Avatar billede kthiesen Novice
24. juni 2011 - 06:52 #1
Hov, der var sneget sig en fejl ind i min ORDER BY:

ORDER BY (by)+0, by ASC
Avatar billede The_Buzz Novice
24. juni 2011 - 09:12 #2
Den sorterer faktisk en varchar string rigtigt i det...

Assens-2011-1 kommer før
Assens-2011-11

Da den første er kortere end #2

Alternativt lave feltet om til to felter
varchar
int

og sortere

order by bynavn asc, bytal asc
Avatar billede arne_v Ekspert
24. juni 2011 - 15:15 #3
Jeg vil sige 3 felter:
  by
  aar
  taeller

http://en.wikipedia.org/wiki/1NF#Atomicity
Avatar billede kthiesen Novice
24. juni 2011 - 16:03 #4
Jeg bliver nødt til at spørge lidt dybere, idet jeg kan se mulighederne i jeres svar.

Er det muligt at sortere i en streng i mysql, altså lade den se på den 3. gruppe af tal og så se de øvrige som konstanter?
Avatar billede arne_v Ekspert
25. juni 2011 - 16:44 #5
Du kan godt sortere paa en substreng af et felt. Men det er ikke den rigtige loesning.
Avatar billede bauerdata Nybegynder
04. juli 2011 - 11:15 #6
Her er en løsning, men som de øvrige skriver så er det nok bedst at databasen skal ændres.
Nedenstående funktion kan du bruges til at sortere og du kan bruge den til at konvertere dine data til en bedre tabeldefinition.

CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
      LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
      delim, '');
SELECT * FROM `test_table`
order by  split_str(bynavn,'-', 1),
split_str(bynavn,'-', 2)+0,
split_str(bynavn,'-', 3)+0;
Avatar billede kthiesen Novice
08. juli 2011 - 07:55 #7
Hej alle

Tak for jeres input.

Til orientering har jeg valgt at følge rådet fra The_Buzz om at tilføje nye felter til databasen.

Jeg lavede en simpel sql, der gik ind og lavede en explode på den eksisterende streng.

Derefter lavede jeg en update på posten så de to felter blev udfyldt med de rigtige data.

Vupti - på 3 sekunder havde jeg rettet 1684 poster.

Venlig hilsen
Kristen
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



IT-JOB