[MSSQL] Search-results limiteren

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Topicstarter
Hallo allen,
Ik ben bezig een search engine te bouwen in MS SQL Server (voor 7.0 en hoger) en ASP. Het werkt allemaal erg basic nog, maar het werkt wel. Ik zit alleen met 1 hand in het haar: ik kan nergens vinden hoe je een bepaald stuk uit een result set kan pakken... in MySQL kun je gebruik maken van de LIMIT clause, maar in MSSQL is er volgens mij alleen het TOP keyword te gebruiken.

Ik wil dus bijvoorbeeld behalve resultaten 1-10 ook 11-20 en 21-30 kunnen weergeven. Hoe kan ik zoiets in een SQL query verwerken?

Ik heb nu basically al zoiets:
code:
1
2
3
4
5
SELECT ID,Titel
FROM Paragrafen
JOIN CONTAINSTABLE(Paragrafen, Tekst, 'blaatblaat') AS KeyTable
     ON KeyTable.Key=Paragrafen.ID
ORDER BY KeyTable.Rank DESC

Hiermee krijg je alle resultaten op relevantie gesorteerd. Maar nu dus nog de 1e 10, 2e 10, 3e 10, enz.

日本!🎌


Verwijderd

Gebruik ROWCOUNT:

SET ROWCOUNT value
<hier je query>

Zie books online voor meer info over ROWCOUNT en TOP en hun verschillen. (belangrijk voor sorting en grouping)

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Topicstarter
He die kende ik nog niet, maar volgens mij is dat niet degene die ik hebben moet... De bovenste 10 of 20 rijen pakken, dat vat ik inmiddels wel. Ik wil juist dat mijn result set op bijv. de 10e rij begint.

Voorbeeld:
Je wilt de tweede pagina van een zoekresultaat van 10 resultaten per pagina laten zien. In MySQL doe je dit:
SELECT * FROM Tekst LIMIT 10,20
Maar in MSSQL gok ik op zoiets:
SELECT TOP 20 * FROM Tekst
en dan eerst naar het 11e record doorscrollen

Ik zoek dus net zoiets als wat dat MySQL statement doet.

日本!🎌


Verwijderd

Je kunt je resultaten via een INSERT INTO query in een temptable inserten en dan daaruit een subselect doen. Je temptable maak je dan net zoals je searchselect resultset, alleen met 1 extra column, nl een identity field.

bv:

INSERT INTO #temptable
<search select query>

Je doet dan een select vanuit je #temptable en returned die, gebruik daarbij de identity column voor het selecteren van een subset. Een temptable blijft bestaan totdat de stored procedure klaar is of totdat de connection gesloten wordt.

Verwijderd

gewoon paging van je ado recordset gebruiken :?

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Topicstarter
tnx, Otis, daar kan ik denk ik wel wat mee, zometeen maar es proberen dan ;)

日本!🎌


Verwijderd

Op dinsdag 19 maart 2002 23:44 schreef Yarvieh het volgende:
gewoon paging van je ado recordset gebruiken :?
Je bedoelt de local cursor moven naar een bepaald record? Dat is ook een mogelijkheid, maar als je je searchresults wilt uitsmeren over meerdere webpages moet je die recordset bewaren in bv een sessionobject, en dat is niet fijn :)

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 22:26

pistole

Frutter

eventueel, als je recordset niet al te groot, en de query niet al te zwaar is, kan je ook opnieuw querien, en in een lusje een movenext doen totdat je bent waar je gebleven was..

Maar ja. Dat is niet super efficient ofzo

Ik frut, dus ik epibreer


Verwijderd

lusje? move next? ik zei paging niet zelf het record er uit vissen...
code:
1
2
rs.PageSize=100 
rs.AbsolutePage=2

Verwijderd

Op woensdag 20 maart 2002 13:20 schreef Yarvieh het volgende:
lusje? move next? ik zei paging niet zelf het record er uit vissen...
code:
1
2
rs.PageSize=100 
rs.AbsolutePage=2
Hoe zet je dit dan precies in die sql statement?

  • Ramon
  • Registratie: Juli 2000
  • Laatst online: 21:09
Op dinsdag 30 april 2002 14:06 schreef boriz het volgende:

[..]

Hoe zet je dit dan precies in die sql statement?
Niet, gewoon in je ASP code.

stel dat je een pagina hebt die records 10 t/m 20 laat zien.

:pagina.asp?start=10

while( id != 10 )
{
rs.MoveNext();
}

Check mijn V&A ads: https://tweakers.net/aanbod/user/9258/


Verwijderd

Whoha over oude }:O gesproken ;)

Ehh je zet 't niet in je sql, je zet 't in de aanroepende asp pagina..

Verwijderd

ja, maar dit
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
call openconnection()
tsql="select crackname,id from get2 where crackname like '"&sort&"%' and filesize <> '0' order by 1 "
set ors=oconn.execute(tsql)

ors.PageSize=100 
ors.AbsolutePage=2

if not ors.eof then

    do while not ors.eof
        Response.Write "<a href=""./download.asp?id="&ors.fields("id")&""">"&ors.fields("crackname")&"</a><br>"
        ors.movenext

    loop
end if

ors.close

call closeconnection()

doet het niet, terwijl dit
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
call openconnection()
tsql="select crackname,id from get2 where crackname like '"&sort&"%' and filesize <> '0' order by 1 "
set ors=oconn.execute(tsql)

if not ors.eof then

    do while not ors.eof
        Response.Write "<a href=""./download.asp?id="&ors.fields("id")&""">"&ors.fields("crackname")&"</a><br>"
        ors.movenext

    loop
end if

ors.close

call closeconnection()

het wel doet

edit:

foutje :)

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Gebruik een ander cursortype: adUseClient (dacht ik).

Overigens heeft zo'n beetje elke ASP tutorial site over dit onderwerp wel een aantal artikelen (verschillende methoden, voor- en nadelen, benchmarks).
zoeken op "asp recordset paging"

Today's subliminal thought is:


Verwijderd

ik moet werken met een mssql db, en ik heb ook dit probleem, alleen ik werk niet met asp maar met coldfusion en ik wil het server side houden. Ik gebruik liever niet een temptable, ik vind dit omslachtig, kan iemand mij uitleggen waarom er niet een standaard functie voor zo'n veelgebruikt probleem is voor mssql?

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 09-01 11:25

D2k

top :?
.edit: overigens wel een oude koe dit :{

Doet iets met Cloud (MS/IBM)


Verwijderd

daarom ga ik in het zelfde forum verder en start ik geen nieuwe, maar top werkt dus alleen de bovenste X aantal records, ik moet de middelse X aantal records hebben, zonder omwegen.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Verwijderd schreef op 10 oktober 2002 @ 14:41:
ik moet werken met een mssql db, en ik heb ook dit probleem, alleen ik werk niet met asp maar met coldfusion en ik wil het server side houden. Ik gebruik liever niet een temptable, ik vind dit omslachtig, kan iemand mij uitleggen waarom er niet een standaard functie voor zo'n veelgebruikt probleem is voor mssql?
Zou inderdaad handig zijn, maar zo'n soort functie is vermoedelijk niet erg snel. En vaak is er toch wel een workaround om dit probleem op te lossen.
Als je bijvoorbeeld alleen sorteert op ID dan kun je de volgende keer een top 10 ophalen waar dit ID groter is dan het laatste ID wat je de vorige keer opgehaald hebt.

En waarom zo'n functie er niet is in MSSQL? Ik denk dat het of (erg) lastig de implementeren is of het heeft behoorlijk nadelige gevolgen voor de performance.
Om ongeveer dezelfde reden zitten er pas sinds MSSQL 2000 cascaded updates/deletes en user defined functions in.

Never underestimate the power of


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

cameodski schreef op 10 oktober 2002 @ 16:46:
En waarom zo'n functie er niet is in MSSQL?
Waarom wel? Er is natuurlijk altijd wel een functionaliteit te verzinnen die er niet inzit ;)
Eigenlijk is het heel simpel zelf te implementeren als je, zoals Otis eerder aangeeft in het topic, met een temp-table werkt. Of inderdaad zelf een startpunt bijhoudt in je query icm TOP. En als je dit ook niet wil kan je ook nog de paging van ADO gebruiken.

Mogelijkheden genoeg dus.

/edit:
cameodski schreef op 10 oktober 2002 @ 16:46:
En vaak is er toch wel een workaround om dit probleem op te lossen.
dat zeg je, Gamma :)
offtopic:
lezen, Annie 8)7

Today's subliminal thought is:

Pagina: 1