Just nu i M3-nätverket
Gå till innehåll
suddaren123

Paging med samma värde? Problem... :(

Rekommendera Poster

Hej!

 

Jag har följande problem för min paging i C#/ASP.NET/SQL SERVER 2005:

 

Jag har alltid använt en pagingfunktion som bygger på att det finns unika värden för varje kolumn i databasen, man har alltid kört paging på primarykey i databasen och så har man ordnat alla rader i kronologisk ordning. Första sidan hämtar "SELECT TOP 20 * FROM Tabellen ORDER BY ID DESC". Andra sidan som hämtar har sparat i en querystring det sista ID på förra sidan, och då körs "SELECT TOP 20 * FROM Tabellen WHERE ID < [sista ID på förra sidan] ORDER BY ID DESC"....

 

...ovanstående fungerar kanon, men nu kommer vi till mitt problem. Jag skulle vilja köra en paging på bästa betyg som användarna har gett t.ex. vissa användarkommentarer. Problemet är då att de flesta kommentarer inte fått några poäng alls och då är poängvärdet i raden 0, jag har alltså inget att gå på när jag kör paging. Första sidan är inga problem för då kör man en ORDER BY Poäng DESC, ID DESC. Då kör den en order by med andraprioritet ID. Men när jag sedan kör nästa sida har jag inte en aning om hur man ska göra. Är det ända alternativet att spara ner resultatet i en tmpTabell vid första sidan som nås och sedan gå efter denna? Det blir väldigt prestandatungt.

 

Hoppas ni förstår mitt problem och om ni har lösning på ovanstående är det fantastiskt :)

 

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Eftersom du kör SQL Server så tycker jag du borde göra om din design en del och använda de tillgängliga syntax som finns. När det gäller paging så kan du antingen använda den inbyggda paging-funktionen som finns inbyggd i .NET:s olika komponenter eller så hämtar du bara delmängden data som ska visas för processande sida.

 

Nackdelen med att använda den inbyggda paging:en i dessa komponenter är att du då hämtar all data men visar bara en delmängd. Det bästa sättet (anser jag) är att skriva om din stored procedure eller sql-sats och använda WITH och ROW_NUMBER() (finns andra sätt att göra det på också). Här är ett enkelt otestat exempel:

 

WITH TempTable AS
(
	SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNumber,*
	FROM DataTabell
       )
SELECT * FROM TempTable
WHERE RowNumber > @PageNumber - 1) * ResultSize
AND RowNumber <= @PageNumber * @ResultSize

 

Du skickar alltså in vilken sida det gäller (@PageNumber) samt hur många träffar per sida som ska visas (@ResultSize)

 

/OZn

_______________________________________________________

[inlägget ändrat 2009-06-26 23:27:19 av -OZn-]

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×
×
  • Skapa nytt...