[Access / MySQL] Syntax probleem Limit / Top

Pagina: 1
Acties:

  • Denga
  • Registratie: September 2000
  • Laatst online: 15-11-2022

Denga

The riding never stops....

Topicstarter
Heren (en Dames),

Ik zit met het volgende probleem, ik heb een programma ooit geschreven voor een mySQL database, daarbij had ik de volgende sytax:

code:
1
strSQL = "SELECT prikbord.* FROM prikbord ORDER BY bericht_id DESC" & " LIMIT " & intStart & ", " & RecordsInPage


Werkt perfect, alleen als ik dit nu wil omzetten voor een Access Database werkt dit niet. Nu weet ik dat het Limit statement in Access niet werkt en is vervangen door Top, en dan kom je op het volgende uit:

code:
1
strSQL = "SELECT TOP " & intStart & ", " & RecordsInPage & " * FROM guests ORDER BY bericht_id DESC"


Hierin gaat het fout, maar als ik 'm een klein beetje vereenvoudig naar:

code:
1
strSQL = "SELECT TOP " & RecordsInPage & " * FROM guests ORDER BY bericht_id DESC"


dan werkt ie wel maar ben ik m'n IntStart kwijt en begint ie iedere pagina met dezelfde berichten, dus iedere pagina hetzelfde...

Iemand een oplossing voor dit probleem?

Never eat yellow snow...


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

TOP is helemaal niet bedoeld om x records midden uit je tabel te halen. Met TOP haal je de eerste x records op. Wat jij wil kan nog steeds, maar dan zul je subqueries moeten gebruiken. Stel je hebt een tabel met 100 records, en je wil record 51 t/m 60, dan haal je eerst de laatste 50 op (SELECT TOP 50 ... ORDER BY ... DESC), en daar pak je weer de TOP 10 van, ORDER BY ... ASC. Je hebt dus, zoals je misschien al gezien hebt, ook een subquery nodig die berekent hoeveel records achter uit de tabel gepakt moeten worden (50 dus, in dit geval).

[ Voor 4% gewijzigd door NMe op 14-04-2006 20:08 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Denga
  • Registratie: September 2000
  • Laatst online: 15-11-2022

Denga

The riding never stops....

Topicstarter
Ik begrijp het deels wat je zegt...

Maar zou j het nog iets duidelijker uit willen leggen? Want dat van die subquery begrijp ik niet helemaal...

Never eat yellow snow...


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Misschien kun je aangeven wat je precies niet begrijpt? Het concept van subqueries? Of begrijp je simpelweg niet hoe ze hier toepasbaar zijn?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Nog een tikje in de goede richting :)

Als je bericht 40-49 wilt ophalen en je hebt 100 records:

SQL:
1
2
SELECT TOP 10 FROM
  SELECT TOP 60 FROM guests ORDER BY bericht_id DESC

Zoiets, ongeveer :)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

Zonder haakjes op de goeie plek dient je voorbeeld niet echt zijn doel. ;) Overigens haal je met die query de records 41-50 op, niet de records 40-49. ;)

Even een soort van pseudocode voor wat je wil, ervanuitgaande dat je de variabelen "aantal" en "positie" gebruikt voor de aantallen:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT TOP aantal *
FROM
(
  SELECT TOP
  (
    SELECT COUNT(bericht_id)
    FROM guests
  ) - positie *
  FROM guests
  ORDER BY bericht_id DESC
)
ORDER BY bericht_id ASC

Ik heb al een tijd niet met T-SQL gewerkt dus mijn kennis ervan is wat roestig. Maar volgens mij zou dit moeten werken.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

-NMe- schreef op zondag 16 april 2006 @ 19:26:
Zonder haakjes op de goeie plek dient je voorbeeld niet echt zijn doel. ;) Overigens haal je met die query de records 41-50 op, niet de records 40-49. ;)
Het was ook een trap in de goede richting en binnen de minuut gepost :)

  • Denga
  • Registratie: September 2000
  • Laatst online: 15-11-2022

Denga

The riding never stops....

Topicstarter
Als ik het volgende doe:
code:
1
strSQL = "SELECT TOP " & RecordsInPage & " * FROM (SELECT TOP (SELECT COUNT(bericht_id) FROM guests) * FROM guests ORDER BY bericht_id ASC) ORDER BY bericht_id DESC"


Dan geeft ie een foutmelding:

code:
1
2
3
Microsoft OLE DB Provider for ODBC Drivers error '80040e14' 

[Microsoft][ODBC Microsoft Access Driver] The SELECT statement includes a reserved word or an argument name that is misspelled or missing, or the punctuation is incorrect.


als ik de 3e SELECT string weg haal en vervan door bv 11 dan doet ie het goed... Alleen begrijp ik niet waar het probleem lig aangezien ik bij de 3e SELECT hetzelfde doe als bij de 2e SELECT...

Never eat yellow snow...


  • Denga
  • Registratie: September 2000
  • Laatst online: 15-11-2022

Denga

The riding never stops....

Topicstarter
Het is al opgelost, heb het effe opgezocht en het blijft dat een SQL statement maar kan bestaan uit 2 SELECT statements i.p.v. 3.

Nu heb ik dat als volgt opgelost:
code:
1
2
3
4
intStart = CInt((page-1) * intRecordsPerPage)
Telling = Totaal - intStart

strSQL = "SELECT TOP " & RecordsInPage & " * FROM (SELECT TOP " & Telling & " * FROM guests ORDER BY bericht_id ASC) ORDER BY bericht_id DESC"



Opgelost, en bedankt voor jullie schopjes in de goede richting (blauwe plekken zijn nog zichtbaar :P )

Never eat yellow snow...


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:08
Je hoeft het niet met subqueries te doen.
Aangezien je je records sorteert op id, weet je ook welk id het laatst opgehaalde bericht heeft.
Je kan dan dit doen:
code:
1
select top 10 from bericht where bericht_id > xxx order by bericht_id

https://fgheysels.github.io/


  • Denga
  • Registratie: September 2000
  • Laatst online: 15-11-2022

Denga

The riding never stops....

Topicstarter
Klopt, alleen is dit ook een redelijk simpele EN overzichtelijke oplossing voor het probleem...

Ben iig blij dat het werkt...

Never eat yellow snow...


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:08
Maar niet zo efficient.

https://fgheysels.github.io/

Pagina: 1