![]() |
Har en SQL-sats:
SELECT * FROM table WHERE id IN (5,9,2) Nu är problemet att jag vill ha dit en ORDER BY som sorterar just efter ordningen som anges i parametern, i detta fallet 5,9,2. Som det är nu får jag nämligen resultaten i formen 2,5,9 vilket inte funkar så bra. Någon som kan vägleda lite? Det är Access-databaser jag jobbar med. |
Lättaste lösningen är nog att sortera efter ett annat värde, om möjligt. Vad är det som gör att du vill ha posterna i den specifika ordningen?
|
Problemet är att jag har data i två olika databaser. Jag gör först en fråga mot den ena databasen där jag får ut den specifika ordningen. Det handlar om en topplista (där sorteringstabellen naturligtvis borde ligga i samma databas som tabellen med objekten)
I nödfall får jag väl slå ihop databaserna och köra med nästlade select-satser eller join eller nåt, det vet jag hur man kan lösa hyfsat enkelt, men nu ser ju databasstrukturen tyvärr ut som den gör... |
Hmm, selektera till temporär tabell med ett extra fält där 5:or blir 1, 9:or 2 och 2:or 3 och sen sortera på det fältet?
|
Citat:
Och för att ni ska slippa att fundera på varför man väljer att designa en sån idiotisk lösning så beror det på att jag hade en databas som uppdaterades dynamiskt (sorteringstabellen med mera), och en av mer statisk karaktär (objekten) som jag ftp:ade fram och tillbaka och redigerade offline... Men det var på modemförbindelsernas tid, så jag antar att behovet av att arbeta offline har minskat något =) |
Citat:
Det enklaste vore väl att bara göra en JOIN mellan den första och andra frågan (eller nästling som du var inne på). Det borde väl gå även med Access även om de är i två databaser? (Det låter dock som det enklaste vore att bara klona tabellen och stoppa in den i samma databas och sedan göra en vanlig JOIN.) |
Om databaserna ligger på samma maskin är det ju inga problem att ställa frågor som joinar data mellan flera olika databaser.
Kod:
SELECT * FROM db1.table1, db2.table2 WHERE ... Kod:
SELECT *, CASE id WHEN 5 THEN 1 WHEN 9 THEN 2 WHEN 2 THEN 3 ELSE NULL END AS sort_order FROM table WHERE id IN (5,9,2) ORDER BY sort_order ASC |
Se där, såna grejer gillar vi! Efter lite Access-anpassning ser min SQL-sats nu ut såhär:
Kod:
SELECT *,SWITCH(id=5,1,id=9,2,id=2,3) AS ranking FROM table WHERE id IN (5,9,2) ORDER BY ranking ASC Tar jag bort det sista ORDER BY så får jag dock inga felmeddelanden utan mina objekt plockas ut. Kod:
SELECT *,SWITCH(id=5,1,id=9,2,id=2,3) AS ranking FROM table WHERE id IN (5,9,2) |
Hur många värden kommer det röra sig om? Är 3 ett exempel eller kommer det vara 3 stycken i verkligenheten också? Är det inte lättare att bara göra det i koden istället för i databasen då?
|
I praktiken kommer det handla om ett 30-tal värden jag vill ha ut. Databasen innehåller ett tusental rader.
|
Att sort inte funkar kan ju bero på begränsningar i access.
|
Citat:
|
Jag har nu fått till en lösning som fungerar, jag har helt enkelt valt att sortera mitt RecordSet som jag får ut som resultat av SQL-frågan.
Kod:
rs.Sort="ranking" Särskilt tack till eg0master som fick mig på rätt spår :) |
Eller så lätt var det inte förresten... Nu när allting funkade så skulle jag ändra på antalet till 30, men då får jag felmeddelande om att min SQL-sats är för komplex. Max verkar vara 14. Varför ska det alltid krångla? Jaja, kör väl med 14 då så länge...
|
Eller sluta köra Access... Access fungerar dåligt så snart du får många samtidiga besökare.
|
Jo, jag vet... Fast jag gillar enkelheten att databasen är i en enda liten fil så att jag lätt kan kopiera över den till min utvecklingsmaskin.
|
Citat:
|
Jag har haft planer på att gå över till MySQL, men jag har inte hunnit sätta mig in i det. Fast det kan vi ta en ny tråd om när det blir dags, tills dess fortsätter jag med leksaksdatabasen. Får börja med att designa om den, och ta det lite i småsteg.
|
Citat:
SELECT * FROM table WHERE id IN (5, 9, 2) ORDER BY FIELD (id, 5, 9, 2) |
Och för den som är nyfiken blir SQL:en för det hela om man kör med tabellerna i samma databas såhär:
Kod:
SELECT TOP 30 objekt.* FROM ranking LEFT JOIN objekt ON objekt.id=ranking.id ORDER BY ranking.count DESC Lite enklare... Men jag lärde mig en hel del på vägen, som att man kan köra SWITCH-satser, det var nytt för mig. |
Alla tider är GMT +2. Klockan är nu 19:36. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson