FAQ |
Kalender |
![]() |
#1 | |||
|
||||
Klarade millennium-buggen
|
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: UserId Name ================ 1 Nisse 2 Kalle 3 Gustav Adress: ======================== AdressId UserId Street Date 1 1 Road1 2008-11-01 2 2 Road2 2008-11-01 3 3 Road3 2008-11-01 4 3 Road4 2009-11-01 5 3 Road5 2010-05-01 Senast redigerad av Robert den 2010-11-09 klockan 17:56 |
|||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Klarade millennium-buggen
|
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 1 1 1 Road1 2008-11-01 2 2 1 Road2 2008-11-01 3 3 1 Road3 2008-11-01 4 3 2 Road4 2009-11-01 5 3 3 Road5 2010-05-01 Senast redigerad av Magnus_A den 2010-11-09 klockan 18:14 Anledning: Nu såg det bättre ut |
||
![]() |
![]() |
![]() |
#3 | |||
|
||||
Klarade millennium-buggen
|
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å?
|
|||
![]() |
![]() |
![]() |
#4 | |||
|
||||
Mycket flitig postare
|
Kod:
select u.*, a.* from Users u join [Address] a on a.UserId = u.UserId and a.AddressId = (select top 1 AddressId from [Address] where UserId = u.UserId order by [Date] desc) ![]() |
|||
![]() |
![]() |
![]() |
#5 | |||
|
||||
Klarade millennium-buggen
|
Citat:
![]() |
|||
![]() |
![]() |
![]() |
#6 | |||
|
||||
Mycket flitig postare
|
||||
![]() |
![]() |
![]() |
#7 | |||
|
||||
Mycket flitig postare
|
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? Senast redigerad av dAEk den 2010-11-12 klockan 21:05 |
|||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Klarade millennium-buggen
|
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.
|
||
![]() |
![]() |
![]() |
#9 | |||
|
||||
Mycket flitig postare
|
||||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Supermoderator
|
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.
__________________
Full-stack developer, free for smaller assignments Senast redigerad av tartareandesire den 2010-11-26 klockan 21:27 |
||
![]() |
![]() |
Svara |
|
|