Avatar billede Rune1983 Ekspert
18. marts 2021 - 10:31 Der er 6 kommentarer og
4 løsninger

ORDER BY udfordring

Har følgende tabel eksempel.
CREATE TABLE `tbPlacering` (
  `Placering_ID` int(10) NOT NULL,
  `Navn` varchar(100) COLLATE utf8_danish_ci NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;

INSERT INTO `tbPlacering` (`Placering_ID`, `Navn`) VALUES
(1, 'Stue 1'),
(2, 'Stue 2'),
(3, 'Stue 3'),
(4, 'Stue 4'),
(5, 'Stue 5'),
(6, 'Stue 11'),
(7, 'Stue 12'),
(8, 'Stue 22'),
(9, 'Stue 25'),
(10, 'Bolig 1'),
(11, 'Bolig 2'),
(12, 'Bolig 11'),
(13, 'Stue 8');

Ønsket resultat
Bolig 1
Bolig 2
Bolig 11
Stue 1
Stue 2
Stue 3
Stue 4
Stue 5
Stue 8
Stue 11
Stue 12
Stue 22
Stue 25

Har prøvet følgende 2 ORDER BY
SELECT * FROM `tbPlacering` ORDER BY CHAR_LENGTH(`Navn`) ASC, `Navn` ASC
SELECT * FROM `tbPlacering` ORDER BY `Navn` ASC

Fandt så denne løsning. Men tror ikke det er den helt korrekte version.
SELECT * FROM `tbPlacering` ORDER BY LEFT(`Navn`,3) ASC,CHAR_LENGTH(`Navn`) ASC, `Navn` ASC

Er der nogen der har andre løsningsforslag?
Avatar billede claes57 Ekspert
18. marts 2021 - 11:24 #1
foranstillede 0 i tal, så
Bolig 01
Bolig 02
Bolig 11
osv... du kan ikke forvente tal-sortering i tekstfelter.
Avatar billede Rune1983 Ekspert
18. marts 2021 - 11:44 #2
#1
Det er desværre ikke mig som indtaster de data ind. Men mig som står med udfordringen. Og kan ikke få de folk som indtaster til at skrive på den måde. :-(
Avatar billede claes57 Ekspert
18. marts 2021 - 12:16 #3
har du mulighed for at oprette 2 felter i db, så tekst og tal adskilles?
Avatar billede Rune1983 Ekspert
18. marts 2021 - 13:05 #4
Nej. Har ikke mulighed for at oprette det særskilt. Bliver en større operation.
Men må leve med den "Løsning" jeg kom frem til med
SELECT * FROM `tbPlacering` ORDER BY LEFT(`Navn`,3) ASC,CHAR_LENGTH(`Navn`) ASC, `Navn` ASC

Undrede mig bare lidt over det. Og tænkte måske nogen havde en smart løsning på det uden at ændre i DB.
Avatar billede ejvindh Ekspert
18. marts 2021 - 13:20 #5
Der er jo også den mulighed at du laver sorteringen i php. Så altså at du henter kolonnen ind usorteret, og så i php først splitter hver streng op i to (explode) og så sorterer først på strengen, og derefter sorterer på den anden del som integer.
Avatar billede Rune1983 Ekspert
18. marts 2021 - 13:33 #6
Godt tænkt Ejvindh.
Men igen. Hvorfor ikke hente det direkte ud som man har behov for det.
Sad lige og kiggede på det igen.
Hvad siger folk til denne SQL?
SELECT * FROM `tbPlacering`
ORDER BY
SUBSTRING_INDEX(`Navn`,' ',1) ASC,
CHAR_LENGTH(`Navn`) ASC,
`Navn` ASC
Avatar billede Rune1983 Ekspert
18. marts 2021 - 13:47 #7
Tror jeg går med denne SQL streng. Den lader til at køre godt. Og som jeg læser det burde den kunne sortere på 3 ord.
SELECT * FROM `tbPlacering`
ORDER BY
SUBSTRING_INDEX(`Navn`,' ',1) ASC,
CHAR_LENGTH(`Navn`) ASC,
SUBSTRING_INDEX(`Navn`,' ',2) ASC,
CHAR_LENGTH(`Navn`) ASC,
SUBSTRING_INDEX(`Navn`,' ',3) ASC,
CHAR_LENGTH(`Navn`) ASC
Avatar billede arne_v Ekspert
18. marts 2021 - 14:18 #8
Det bliver under alle omstændigheder et workaround.

Den rigtige løsning må være at lave et specielt felt til sortering som ikke vises.

Dette felt kan enten genereres automatisk af noget PHP kode eller man kan lave en order edit PHP side hvor brugeren kan vælge rækkefølge.
Avatar billede Rune1983 Ekspert
18. marts 2021 - 14:27 #9
Tak for jeres inputs.
Burde nok have været designet anderledes fra start af.

Følgende SQL virker for mit tilfælde. Giver det resultat jeg forespørger.
SELECT
`Placering_ID`,
`Navn`
FROM `tbPlacering`
ORDER BY
SUBSTRING_INDEX(`Navn`,' ',1) ASC,
FIELD(`Navn`,CONCAT(SUBSTRING_INDEX(`Navn`,' ',1),'%') ) ASC,
CHAR_LENGTH(CONCAT(SUBSTRING_INDEX(`Navn`,' ',1),'%')) ASC,
FIELD(`Navn`,CONCAT(SUBSTRING_INDEX(`Navn`,' ',2),'%') ) ASC,
CHAR_LENGTH(CONCAT(SUBSTRING_INDEX(`Navn`,' ',2),'%')) ASC,
FIELD(`Navn`,CONCAT(SUBSTRING_INDEX(`Navn`,' ',3),'%') ) ASC,
CHAR_LENGTH(CONCAT(SUBSTRING_INDEX(`Navn`,' ',3),'%')) ASC,
FIELD(`Navn`,CONCAT(SUBSTRING_INDEX(`Navn`,' ',4),'%') ) ASC,
CHAR_LENGTH(CONCAT(SUBSTRING_INDEX(`Navn`,' ',4),'%')) ASC,
FIELD(`Navn`,CONCAT(SUBSTRING_INDEX(`Navn`,' ',5),'%') ) ASC,
CHAR_LENGTH(CONCAT(SUBSTRING_INDEX(`Navn`,' ',5),'%')) ASC
Avatar billede Rune1983 Ekspert
18. marts 2021 - 14:44 #10
Da jeg kørte det på min tabel med drift data skulle den lige rettes til følgende.
SELECT
`Placering_ID`,
`Navn`
FROM `tbPlacering`
ORDER BY
SUBSTRING_INDEX(`Navn`,' ',1) ASC,
FIELD(`Navn`,CONCAT(SUBSTRING_INDEX(`Navn`,' ',1),'%') ) ASC,
CHAR_LENGTH(CONCAT(SUBSTRING_INDEX(`Navn`,' ',1),'%')) ASC,
CONCAT(SUBSTRING_INDEX(`Navn`,' ',1),'%') ASC,
FIELD(`Navn`,CONCAT(SUBSTRING_INDEX(`Navn`,' ',2),'%') ) ASC,
CHAR_LENGTH(CONCAT(SUBSTRING_INDEX(`Navn`,' ',2),'%')) ASC,
CONCAT(SUBSTRING_INDEX(`Navn`,' ',2),'%') ASC,
FIELD(`Navn`,CONCAT(SUBSTRING_INDEX(`Navn`,' ',3),'%') ) ASC,
CHAR_LENGTH(CONCAT(SUBSTRING_INDEX(`Navn`,' ',3),'%')) ASC,
CONCAT(SUBSTRING_INDEX(`Navn`,' ',3),'%') ASC,
FIELD(`Navn`,CONCAT(SUBSTRING_INDEX(`Navn`,' ',4),'%') ) ASC,
CHAR_LENGTH(CONCAT(SUBSTRING_INDEX(`Navn`,' ',4),'%')) ASC,
CONCAT(SUBSTRING_INDEX(`Navn`,' ',4),'%') ASC,
FIELD(`Navn`,CONCAT(SUBSTRING_INDEX(`Navn`,' ',5),'%') ) ASC,
CHAR_LENGTH(CONCAT(SUBSTRING_INDEX(`Navn`,' ',5),'%')) ASC,
CONCAT(SUBSTRING_INDEX(`Navn`,' ',5),'%') ASC
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

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