Rune1983 Guru
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?
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.
Rune1983 Guru
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. :-(
claes57 Ekspert
18. marts 2021 - 12:16 #3
har du mulighed for at oprette 2 felter i db, så tekst og tal adskilles?
Rune1983 Guru
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.
ejvindh Professor
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.
Rune1983 Guru
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
Rune1983 Guru
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
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.
Rune1983 Guru
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
Rune1983 Guru
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
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.

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





Premium
Atea stormer frem: Her er de 20 it-leverandører som branchen mener har de bedste produkter, ydelser og service
Computerworld Image 2021: Disse 20 selskaber leverer ifølge det professionelle it-Danmark de bedste produkter, de bedste ydelser og har den bedste service. Se listen her.
Computerworld
Nu er de her: Efter flere års rygter lancerer Apple Airtags
Langt om længe kan du købe Apples Airtags. De kan modstå støv og vand, og samtidig gør de det muligt for millioner af iPhone-brugere at hjælpe dig med at finde dine nøgler.
CIO
Har du rost din mellemleder i dag? Snart er de uddøde - og det er et tab
Computerworld mener: Mellemledere lever livet farligt: Topledelsen får konstant ideer med skiftende hold i virkeligheden, og moden går mod flade agile organisationer. Men mellemlederen er en overset hverdagens helt med et kæmpe ansvar. Her er min hyldest til den ofte latterliggjorte mellemleder.
Job & Karriere
"Vi var nødt til at sige til dem, at I er nødt til at sende ham hjem nu, for han begynder at knække"
"Vi var nødt til at sige til dem, at I er nødt til at sende ham hjem nu, for han begynder at knække"
White paper
Udnyt ressourcerne bedre og skru op for overskuddet
Spildt arbejde, ineffektive processer og ringe forretningsindsigt er blot tre tegn på ringe ressourceudnyttelse. I dette whitepaper får du viden om, hvordan du måler ressourceudnyttelsen – og bruger indsigten operationelt, taktisk og strategisk.