Ik begin ff met een link naar een topic dat ik eerder in mijn leven hier gepost heb:
[rml][ MSSQL] Search-results limiteren[/rml]
Kort samengevat: het gaat er in dit topic om, dat een statement in MSSQL de eerste 10, de tweede 10, de derde 10 (enz) records teruggeeft. Het kwam erop neer dat er 3 oplossingen waren:
De eerste manier is door TOP 2x te gebruiken met een intensievere WHERE clause. Stel dat je de tweede set van 10 records wilt. Je pakt alle records en kijkt welke daarvan niet de bovenste 10 zijn. van wat je overhoudt pak je weer de bovenste 10:
De tweede manier lijkt er wel op, maar is toch iets anders en ik denk ook minder efficiënt omdat de sortering twee keer omgedraaid wordt. Aan de andere kant wordt er geen "SELECT * FROM" gedaan over de betreffende tabel. Het principe is vrij eenvoudig, maar niet om zelf 'ff' te bedenken
Men neme de bovenste 20 records, je sorteert ze in normale volgorde, zodat je de bovenste 20 krijgt. Daaruit pak je de bovenste 10 die je in omgekeerde volgorde sorteert, zodat je de onderste 10 krijgt. Tot slot pak je van het resultaat alles dat je in normale volgorde sorteert:
Dit is misschien wel een leuke voor de faq, want ik kan me voorstellen dat meer mensen met hetzelfde probleem zitten. Dit is immers een veel voorkomend probleem bij het weergeven van zoekresultaten per pagina van bijv 10.
Mijn vraag nu (3 eigenlijk): zijn er mensen die dit misschien ook gedaan hebben en tot een andere efficiëntere oplossing gekomen zijn? Of zijn er misschien mensen die deze twee gegeven queries kunnen verbeteren in performance? Zijn er misschien lui die het voormekaar krijgen om in dit soort queries geen veld met unieke inhoud nodig te hebben?
Ben benieuwd
[rml][ MSSQL] Search-results limiteren[/rml]
Kort samengevat: het gaat er in dit topic om, dat een statement in MSSQL de eerste 10, de tweede 10, de derde 10 (enz) records teruggeeft. Het kwam erop neer dat er 3 oplossingen waren:
- gebruik TOP en scroll door
- gebruik ADO's paging mechanisme
- combinatie van deze twee
De eerste manier is door TOP 2x te gebruiken met een intensievere WHERE clause. Stel dat je de tweede set van 10 records wilt. Je pakt alle records en kijkt welke daarvan niet de bovenste 10 zijn. van wat je overhoudt pak je weer de bovenste 10:
code:
1
2
3
4
5
| SELECT TOP 10 * FROM (
SELECT * FROM Artikelen WHERE ID NOT IN (
SELECT TOP 10 ID FROM Artikelen ORDER BY ID
)
) AS x |
De tweede manier lijkt er wel op, maar is toch iets anders en ik denk ook minder efficiënt omdat de sortering twee keer omgedraaid wordt. Aan de andere kant wordt er geen "SELECT * FROM" gedaan over de betreffende tabel. Het principe is vrij eenvoudig, maar niet om zelf 'ff' te bedenken
Men neme de bovenste 20 records, je sorteert ze in normale volgorde, zodat je de bovenste 20 krijgt. Daaruit pak je de bovenste 10 die je in omgekeerde volgorde sorteert, zodat je de onderste 10 krijgt. Tot slot pak je van het resultaat alles dat je in normale volgorde sorteert:
code:
1
2
3
4
5
6
| SELECT * FROM (
SELECT TOP 10 * FROM (
SELECT TOP 20 * FROM Artikelen ORDER BY ID
) as x
ORDER BY ID DESC) as y
ORDER BY ID |
Dit is misschien wel een leuke voor de faq, want ik kan me voorstellen dat meer mensen met hetzelfde probleem zitten. Dit is immers een veel voorkomend probleem bij het weergeven van zoekresultaten per pagina van bijv 10.
Mijn vraag nu (3 eigenlijk): zijn er mensen die dit misschien ook gedaan hebben en tot een andere efficiëntere oplossing gekomen zijn? Of zijn er misschien mensen die deze twee gegeven queries kunnen verbeteren in performance? Zijn er misschien lui die het voormekaar krijgen om in dit soort queries geen veld met unieke inhoud nodig te hebben?
Ben benieuwd
日本!🎌