SQL-Statement Zugriff auf nummerierte Treffer?

Hallo,

Gibt es für SQL irgendein Statement mit dem man direkt in SQL Abfragen gestalten kann die aus einer Menge eine fest definierte Anzahl von (Folge) Treffern liefern können–> Mal ein Beispiel:wink:

Angenommen ich hab eine Datenbank mit 1000 verzeichneten CDs ich will nun im Internet immer jeweils auf einer Seite 10 CDs darstellen und so dem User geben durch alle 1000 CDs in Folge zu blättern von 1 bis 1000. Auf jeder SEite wird dabei auch gleich ein Link integrierte der auf die „nächsten 10“ CDs verweist…

Jetzt kenne ich leider kein SQL statement, mit dem man sowas machen kann. (Ich bekomme entweder die Gesamtdatenbank zurück oder eben die allerersten 10 Treffer. Von diese aber ausgehend die weiteren 10 folgenden Treffer zu ermitteln funktioniert bei mir mit SQL nicht…)
Wer kennt sich da aus und kann mir entweder bestätigen, dass das un möglich ist, oder noch viel besser beschreiben dass es doch geht:wink:

(Meine Lösung wäre mit select * from xxx alle auszulesen und dann dieses Ergebnismenge mit einer Programmiersprache (Java)entsprechend in die 10 Untermengen zu verteilen… Allerdings würde mich interessieren ob man das auch direkt in SQL machen kann.
–> select first 10 results from DB
–> select next 10 results (starting from last results) from DB…
)
Vielen Dank.
Julian

Jetzt kenne ich leider kein SQL statement, mit dem man sowas
machen kann. (Ich bekomme entweder die Gesamtdatenbank zurück
oder eben die allerersten 10 Treffer. Von diese aber ausgehend
die weiteren 10 folgenden Treffer zu ermitteln funktioniert
bei mir mit SQL nicht…)
Wer kennt sich da aus und kann mir entweder bestätigen, dass
das un möglich ist, oder noch viel besser beschreiben dass es
doch geht:wink:

(Meine Lösung wäre mit select * from xxx alle auszulesen und
dann dieses Ergebnismenge mit einer Programmiersprache
(Java)entsprechend in die 10 Untermengen zu verteilen…
Allerdings würde mich interessieren ob man das auch direkt in
SQL machen kann.
–> select first 10 results from DB
–> select next 10 results (starting from last results)
from DB…

also, in java muss man sowieso mit einem resultset arbeiten. dieser beinhaltet generell alle treffer, die dann sequentiell abgearbeitet werden können. damit ist das aufteilen in 10er blöcke trivial.

aber du möchstest ja mit sql-mitteln arbeiten. der einfachste und offensichtlichste ansatz: füge in die datenbank ein zusätzliches numerisches feld ein. dieses beinhaltet einfach eine fortlaufende nummer. problem dabei: die sortierreihenfolge sollte möglichst fix vorgegeben sein. die abfrage ist dann einfach:
select * from cds where nr between 120 and 130;

problem: soll jeder anwender nach eigenen kriterien sortieren können, darf das nummern-feld nicht mehr in der cd-tabelle sein. sonst könnte ja nur einer richtig sortieren. die nummer müsste in eine zusätzliche tabelle ausgelagert werden, die die cds und eine art session-id miteinander in verbindung bringt und dazu die nummer speichert.

anderer ansatz: das gui erlaubt sowieso nur 3 - 4 verschiedene sortierungsmöglichkeiten. dann einfach eben 3 - 4 numerische felder mit fortlaufenden zeilen einbauen und entsprechend selektieren.

nach jedem insert muss natürlich der „sortierindex“ neu aufgebaut werden. sollte aber kein wirkliches problem darstellen.

erwin

hi!

problem: soll jeder anwender nach eigenen kriterien sortieren
können, darf das nummern-feld nicht mehr in der cd-tabelle
sein. sonst könnte ja nur einer richtig sortieren. die nummer
müsste in eine zusätzliche tabelle ausgelagert werden, die die
cds und eine art session-id miteinander in verbindung bringt
und dazu die nummer speichert.

eine ziemlich schmutzige lösung: eine view basteln, die das user-orientierte order-by enthält und die rownum als zusätzliches feld selektieren - aber ich bin mir sicher, es gibt auch noch eine elegantere lösung

grüße,
tomh

Hallo Julian!

Im ANSI Standard ist sowas meines Wissens nicht vorhanden. Unter Oracle gibt’s (ich glaube seit 8.1.7, könnte aber auch älter sein) die ‚analytical functions‘, darunter auch „RANK“. Da die Doku da etwas schwer zu verstehen ist, helfe ich dir im Bedarfsfall gerne weiter…

Gruß,
Martin

P.S.: Auch der MS SQL Server hat da glaube ich irgendeine Implementierung, aber das ist für mich eine fremde Baustelle :wink:

eine ziemlich schmutzige lösung: eine view basteln, die das
user-orientierte order-by enthält und die rownum als
zusätzliches feld selektieren - aber ich bin mir sicher, es
gibt auch noch eine elegantere lösung

soweit ich weiss, kann in der view-deklaration kein order-by stehen. eine sortierte view ist damit nicht möglich. möglicherweise klappt das mit einer materialized view, was aber etwas am thema vorbeigeht.

erwin

hi!

soweit ich weiss, kann in der view-deklaration kein order-by
stehen. eine sortierte view ist damit nicht möglich.
möglicherweise klappt das mit einer materialized view, was
aber etwas am thema vorbeigeht.

war mir jetzt selber unsicher - deshalb hab ich’s ausprobiert: das order-by funktioniert mit einer ganz normalen view … und sogar richtig! :wink:

grüße,
tomh

Hallo,

Gibt es für SQL irgendein Statement mit dem man direkt in SQL
Abfragen gestalten kann die aus einer Menge eine fest
definierte Anzahl von (Folge) Treffern liefern können–>
Mal ein Beispiel:wink:

Also es gibt für Dein Problem eine Standardlösungen, die sich je nach Datenbank etwas unterscheiden kann.
>> SQL-STATEMENT … LIMIT ,
wobei Du bei Start einfach den Datensatz einfügst, an dem begonnen werden soll (kann auch eine Variable sein) und für Anzahl in Deinem Beispiel würdest Du 10 einfügen.

Kannst mich gerne per Mail kontaktieren, falls es weitere Fragen gibt!

Marcus

Vielen Dank für eure Antworten!! (o.T)