![]() |
Problem med SQL-fråga
Hej på er,
Sitter fast i SQL-träsket med en fråga jag inte får till... Nedan har jag två (fejkade) tabeller, en för användare och en för adresser. En användare kan ha flera adresser där ett datum bestämmer vilken adress som är den senaste (aktuella). Hur gör jag för att selektera ut samtliga users och joina in endast den senaste adressen för varje user? Det som ställer till det för mig är att jag vill kunna selekta ut alla kolumner från adress-tabellen (svårt att göra en group by med andra ord) Kod:
Users: |
Pröva med att ha en sammansatt index med autoincrement som bygger på båda kolumnerna AdressId och UserId i adress-tabellen
Då kommer tabellen att se ut så här: Adress: ======================== Kod:
AdressId UserId Kombo_Autoincrement Street Date |
Hmmm, jag har tyvär bara möjlighet att skriva frågor, inte ändra i databasstrukturen. Det var väl det ditt förslag gick ut på?
|
Kod:
select |
Citat:
|
Citat:
Varför man inte skulle använda en join med group by här har jag svårt att förstå. |
Uppdaterat 2010-11-12:
Med 1 miljon rader i båda tabellerna tog frågan ca 6 sekunder (~19 allt som allt, inkl. att returnera alla rader) att köra på min 5 år gamla burk. Körde sedan frågan genom query tuning analysern och det visade sig att jag inte hade bra index. Med ett nytt index som innehåller både UserId och Date körs frågan omedelbums. Det som tar tid är att returnera raderna (~14 sek). Hur som helst: Sql är inte mitt starkaste område så andra lösningar är fortfarande intressanta. Hur skulle du skriva frågan? |
När man använder group by är det svårt att styra vilken rad i gruppen som väljs ut. Enligt mina erfarenheter är det den första raden, och man skulle kunna styra det genom att sortera tabellen i förväg. Men det är odokumenterat och jag skulle inte lite på det. Subquery är nog vägen att gå här, om man inte kan göra tabellen på ett bättre sätt.
|
Citat:
|
Citat:
Om ni verkligen inte har möjlighet att ändra databasen på något vis så skulle en extrem alternativ lösning vara att spara varje användare med nuvarande adress i en fil. |
Det finns egentligen två alternativ för att göra det effektivt:
- Anpassa tabellstrukturerna efter datan och frågorna som ska ställas mot den. Skulle enkelt kunna innebära att endast ha en extra relationstabell mellan dom, men det saknas något effektivt unikt att koppla mot i adress-strukturen ovan. Alternativet vore att ha en flagga i adress-tabellen för aktuell adress. - Cacha den relevanta datan i en separat tabell/plats. Och sen det sista alternativet. Använda en query som ovan med en subquery vilket (i de allra flesta fall) resulterar i en väldig overhead. |
Alla tider är GMT +2. Klockan är nu 22:50. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson