SQL: konstig sortering önskas *** L Ö S T ***

Tråden skapades och har fått 16 svar. Det senaste inlägget skrevs .
1

Tja!

ORDER BY-fråga:

mysql> select titel from tabell order by titel

är en vanlig sql som ger resultatet:

+-------------------------------------------------------------------+
| titel |
+-------------------------------------------------------------------+
| 3 screenplays. Force Majeure. The Dispossessed. Hasta Luego |
| 8½ |
| Alphaville |
| American Beauty |
| Billedanalyse |
| Blow Up |
| China is near |
+-------------------------------------------------------------------+

Men säg att jag vill ha en explicit sortering som säger, i klarspråk, "Sortera in alla som är 'Blow Up' först, sen sortera resten i bokstavsordning" - är det möjligt? Jag vill ha följande resultat:

+-------------------------------------------------------------------+
| titel |
+-------------------------------------------------------------------+
| Blow Up |
| 3 screenplays. Force Majeure. The Dispossessed. Hasta Luego |
| 8½ |
| Alphaville |
| American Beauty |
| Billedanalyse |
| China is near |
+-------------------------------------------------------------------+

Kom igen nu då…

Senast redigerat 2004-06-09 17:32
  • Medlem
  • Stockholm
  • 2004-05-11 12:28

Man får göra två queries. Ingen kommer att retas, jag lovar.

SELECT titel FROM tabell WHERE titel LIKE "Blow Up";
SELECT titel FROM tabell WHERE titel NOT LIKE "Blow Up" ORDER BY titel;

Jo, en UNION fungerar så klart men i det aktuella fallet så kommer det att komma en hel lista av värden som det ska sorteras efter, och det känns ju sugigt att göra 30 UNIONS om det finns ett färdigt sätt att peta in det i en ORDER BY på...

Detta känns som något som är mer fördelaktigt (prestandamässigt) att göra på applikationsnivå än i databasen. Vilket inte alls var svar på din fråga...

Ursprungligen av Hagelin:

Detta känns som något som är mer fördelaktigt (prestandamässigt) att göra på applikationsnivå än i databasen. Vilket inte alls var svar på din fråga...

Så länge det handlar om ett begränsat antal rader, ja. Men PHP blir slött vid större antal, dessvärre....

Om du använder UNION kombinerat med IN/NOT IN i vilkoret borde det fungera om du har den exakta titeln

Något förkortat:
SELECT ... WHERE titel IN ('Blow Up', ...) ...
UNION
SELECT ... WHERE titel NOT IN ('Blow Up', ...) ...

Joakim

  • Oregistrerad
  • 2004-06-09 15:36

Det är ju dumt att det inte finns något som detta:
orber by "första saken", "andra saken", "tredje saken", name

Ursprungligen av scooterbabe:

Men säg att jag vill ha en explicit sortering som säger, i klarspråk, "Sortera in alla som är 'Blow Up' först, sen sortera resten i bokstavsordning" - är det möjligt?

I allra högsta grad! Då ska du använda en SQL-sats som blir något i stil med följande:

SELECT titel FROM tabell
ORDER BY titel = 'Blow Up' DESC,
         titel ASC;

Anledningen till att du behöver göra första sorteringen i fallande ordning är att false sorteras före true, så att "Blow Up" hamnar allra sist (eftersom alla andra titlar ju ger värdet false). Alternativt kan du utelämna "DESC" och i stället ändra kriteriet till "titel <> 'Blow Up'", så att "Blow Up" ger värdet false medan alla andra ger true.

Ursprungligen av Samuel K:

I allra högsta grad! Då ska du använda en SQL-sats som blir något i stil med följande:

SELECT titel FROM tabell
ORDER BY titel = 'Blow Up' DESC,
         titel ASC;

Anledningen till att du behöver göra första sorteringen i fallande ordning är att false sorteras före true, så att "Blow Up" hamnar allra sist (eftersom alla andra titlar ju ger värdet false). Alternativt kan du utelämna "DESC" och i stället ändra kriteriet till "titel <> 'Blow Up'", så att "Blow Up" ger värdet false medan alla andra ger true.

Fick anledning att testa det nu, men det ser inte ut att fungera i mySQL...

Ursprungligen av scooterbabe:

Fick anledning att testa det nu, men det ser inte ut att fungera i mySQL...

Åhå, ännu en punkt i min 100-anledningar-till-att-mysql-stinker-lista...

Ursprungligen av Samuel K:

Åhå, ännu en punkt i min 100-anledningar-till-att-mysql-stinker-lista...

Japp jag håller delvis med, stödet för t.ex. stored procedures, triggers, och foreign keys verkar helt fucked up.

De säger i och för sig att foreign keys skall fungera om man kör med InnoDB typen, men jag har aldrig fått det att fungera i alla fall.

Det som dock är bra är ju att det finns en bra dokumentation till MySQL på deras hemsida, samt att den är gratis.

  • Oregistrerad
  • 2004-06-16 10:41
Ursprungligen av scooterbabe:

Fick anledning att testa det nu, men det ser inte ut att fungera i mySQL...

För mig fungerar det utmärkt med MySql. Använder det till att lägga exakt träffar först i ett sökresultat. Kan dock inte svara för det där med COUNT(), men det finns iaf tillfällen då det funkar.

  • Medlem
  • Stockholm
  • 2004-06-09 17:23

s m a r t !

Tusen tack Samuel - precis vad jag sökte! Kommer inte ihåg varför längre, men det var säkert i samband med att språkvariabler hämtades från en databas, och istället för att välja DK så ville jag välja samtliga, sortera enl ovan på DK och göra en limit på 1 för att kunna få ett annat språk om översättning till DK saknades...

  • Oregistrerad
  • 2004-06-09 23:18

Jag har letat efter detta tidigare, men då fick jag svaret att det inte gick. Verkar vara ganska okänt. Men kan vara användbart. *sparar i minnet*

Hehe

Men är det så? Jag fick något slags resultat, men jag kunde inte få det att fungera med min kolumn med count()-värden...

  • Medlem
  • Höganäs
  • 2004-06-16 10:52

OT
Helt rätt att sätta "Blow up" först! Mkt bra skiva!

(om det nu är en skiva och om det är den skiva jag tänker på...)
/OT

1
Bevaka tråden