23. august 2005 - 10:48Der 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?
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
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).
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.
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.
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.
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.
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;"
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
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.