Avatar billede justask Nybegynder
23. august 2005 - 10:48 Der er 18 kommentarer og
1 løsning

kan man sortere med andet end ASC/DESC?

Hej

Jeg har brug for at lave en SELECT hvor jeg styrer hvilke værdier der kommer ud først - og det er ikke nok at gøre det stigende/faldende. Tabellen kunne være fyldt med navne og deres aldre:

Hans , 19
Per , 33
Søren , 47
Ida , 22

Og jeg har f.eks. brug for en SELECT der sikrer at først kommer folk med "I" ud og dernæst folk med "P" og dernæst alfabetisk. Er det muligt? Evt. ved brug af GROUP BY eller ORDER BY?
Avatar billede fennec Nybegynder
23. august 2005 - 10:53 #1
Hvilken database bruger du??
Avatar billede imago-dei Nybegynder
23. august 2005 - 10:57 #2
Hvis du ved hvad du vil have først, kan du f.eks. først hente alle med I derefter alle med P og derefter resten. Dvs. du får i dette tilfælde tre select statements, som du kan lave UNION imellem.

Pseudokode:

SELECT * FROM X WHERE name LIKE I%

UNION

SELECT * FROM X WHERE name LIKE P%

UNION

SELECT * FROM X WHERE name NOT LIKE I% AND name NOT LIKE P% ORDER BY name ASC
Avatar billede fennec Nybegynder
23. august 2005 - 10:58 #3
I MySQL kan man "snyde" ORDER BY, men jeg ved ikke om det virker i andre databaser også:

SELECT * FROM countries ORDER by shortKode IN ('DK', 'US') desc, shortKode

på denne måde DK og US først hvorefter resten er sorteret stigende.
Avatar billede arne_v Ekspert
23. august 2005 - 11:17 #4
I SQL dialekter som understøtter user functions kam nman altid lave
en function som konverterer til noget der sorterer som man vil have det
Avatar billede justask Nybegynder
23. august 2005 - 11:18 #5
Hejsa

Den UNION og LIKE strategi du foreslår (imago-dei) ser ikke helt tosset ud, dog er LIKE-søgninger vidst ret langsomme?

Hvad med din, fennec, hvorfor er det "snyd" at bruge IN()? Jeg kan ikke lige finde funktionen på mysql.com. Og jeg kan faktisk heller ikke få den til at fungere helt godt synes jeg! Men den ser ret simpel ud, det lige sådan noget jeg håbede på (og håbede at undgå det der UNION-noget, det bliver hurtigt svært at overskue).

Takker so far

ps. det er mysql det drejer sig om
Avatar billede fennec Nybegynder
23. august 2005 - 11:28 #6
Den er heller ikke rigtig angivet på MySQL. Det er en bruger der har opdaget det, og du kan læse om det i "User Comments" her:
http://dev.mysql.com/doc/mysql/en/select.html

Det er et godt stykke nede og det er Imran Chaudhry der har skrevet om det. Det virker sikkert ikke i ældre versioner af MySQL, så det kan være derfor det ikke virker hos dig.
Avatar billede imago-dei Nybegynder
23. august 2005 - 11:35 #7
Jo Like er forholdsvis langsomme, men det er eneste alternativ, hvis du vil først hente alle ord, som begynder med et bestemt bogstav.

Du kan vist ikke i et sæt (som IN bruger) angive at ord skal begynde med et bestemt bogstav. Efter IN skal du have et sæt af værdier, og som jeg forstår dit spørgsmål kender du ikke i forvejen alle navne med "I" og alle navne med "P". Derfor kan du ikke umiddelbart bruge metoden med IN.

Du kan dog bruge begge løsninger ved at oprette en ekstra kolonne, som indeholder begyndelsesbogstavet. Så slipper du for LIKE i mit forslag, og så kan du bruge forslaget fra fennec.
Avatar billede fennec Nybegynder
23. august 2005 - 11:38 #8
Har aldrig selv brugt IN metod i ORDER, men i dit tilfælde vil jeg tro det skal være sådan:
... ORDER BY LEFT(navn,1) in ('I','P')
Avatar billede teepee Nybegynder
23. august 2005 - 11:40 #9
Ikke for at være på tværs, men lige meget hvilke koder eller randomfunktioner man bruger, så er kolonnerne altid sorteret enten asc/desc uanset hvad :-) At man laver sin egen kolonne med pseudo værdier, så ens rigtige kolonner bliver sorteret anderledes, ændrer ikke ved det faktum at pseudo-kolonnen er sorteret enten asc eller desc.
Avatar billede justask Nybegynder
23. august 2005 - 12:05 #10
Hejsa

Imago-Dei: Rent faktisk kender jeg godt værdierne som jeg skal SELECTe da det er tekstuelle repræsentationer af bannere ("stortbanner", "lillebanner" etc.).

fennec: Jeg kan ikke få nogle gode resultater med IN()-funktionen, det bliver ikke rigtig sorteret i forhold til indholdet af IN()-funktionen (jeg sidder med php 4.3 og mysql 4.0): ex.: "SELECT * FROM mr_table ORDER BY LEFT(bannertype, 1) IN ('stortbanner') ASC;" giver i alle fald ingen logisk sortering på mr_table.bannertype. Måske min software er for gammel...

teepee: Du har ganske ret, mit ønske er blot at styre sorteringen og ikke nøjes med alfabetisk stigende/faldende.
Avatar billede justask Nybegynder
23. august 2005 - 12:19 #11
Tusind tak for hjælpen, UNION-strategien virker fint  :)
Avatar billede justask Nybegynder
23. august 2005 - 12:21 #12
Hvis du lægger et svar får du vidst også lidt point  :o)
Avatar billede fennec Nybegynder
23. august 2005 - 12:22 #13
Det kan jeg godt forstå, din sammenligning er jo forkert. Hvis du sammenligner på hele værdien i bannertype skal der jo ikke LEFT omkring:
SELECT * FROM mr_table ORDER BY bannertype IN ('stortbanner'), bannertype asc;"
Avatar billede justask Nybegynder
23. august 2005 - 12:22 #14
og det er imago-dei jeg tænker på (sorry, nu skal jeg nok la' vær' med at skrive mere)...
Avatar billede justask Nybegynder
23. august 2005 - 12:31 #15
wow - du har sq ret, fennec, nu virker det  :)
Avatar billede fennec Nybegynder
23. august 2005 - 12:39 #16
Jeg mente nok også det skulle virke, men det virke ikke i Access eller MS-SQL, så det er ikke en "global" løsning, så man kan ikke skifte database senere :(

Union metoden er der imod global, og skulle gerne virke i alle databaser :o)

Point går vel stadig til imago-dei.
.o) <-- One Eyed Jack
Avatar billede justask Nybegynder
23. august 2005 - 12:41 #17
ikke hvis du er hurtig, jeg bruger nemlig din løsning (selvom de begge virker), det er vel okay?
Avatar billede fennec Nybegynder
23. august 2005 - 13:04 #18
Vi kan vel dele point så...
Avatar billede justask Nybegynder
23. august 2005 - 14:48 #19
well - tak for det i alle fald
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