Stefan: SQL - Die letzten sechs Datensätze anzeigen

Hallo,
ich suche eine Möglichkeit, mittels eines SQL Befehls die letzten sechs Datensätze anzuzeigen, ohne den letzten Datensatz.

Beispiel: Wenn mein DB 10 Einträge hat, möchte ich den Eintrag 5-9 anzeigen, wenn sie 100 Einträge hat, den Datensatz 95-99 usw.

Vielen Dank, schon mal.
mfg Stefan

  1. Hallo,
    ich suche eine Möglichkeit, mittels eines SQL Befehls die letzten sechs Datensätze anzuzeigen, ohne den letzten Datensatz.

    Hi!

    Na ist doch eigentlich kein Thema. Ich kenn mich mit SQL nicht aus. Deshalb würde ich es so machen. Du führst eine laufende Nummer (ID) ein. Läßt Dir den Maximalwert anzeigen nach dem Motto:

    set Anzahl = Conn.Execute("select Max(ID) as MaxID from Tabelle")
    nummer = Anzahl("MaxID")

    Dann hast Du in nummer den höchsten Wert der laufenden Nummer.
    Davon dividierst Du 5. Dann machst Du wieder ne Abfrage in ner Schleife und gibst die Datensätze aus:
    Conn.Execute ("select * from Tabelle where ID = x")

    Prinzip verstanden? Müßte doch eigentlich so funktionieren. Sicher gibts auch ne einfachere Variante aber die weiß ich nicht.

    Bis denne....
    MarkX.

    1. Dann aber auf jeden Fall meine Variante benutzen... Ist nicht nur einfacher, quält auch den (SQL-)Server weniger.. :o)

      Zeek

    2. Moin!

      Na ist doch eigentlich kein Thema. Ich kenn mich mit SQL nicht aus. Deshalb würde ich es so machen. Du führst eine laufende Nummer (ID) ein. Läßt Dir den Maximalwert anzeigen nach dem Motto:

      set Anzahl = Conn.Execute("select Max(ID) as MaxID from Tabelle")
      nummer = Anzahl("MaxID")

      Das holt die höchste vergebene ID. Soweit ok.

      Dann hast Du in nummer den höchsten Wert der laufenden Nummer.
      Davon dividierst Du 5. Dann machst Du wieder ne Abfrage in ner Schleife und gibst die Datensätze aus:

      "Subtrahierst", nicht "dividierst". Dividieren heißt "teilen", subtrahieren heißt "minus-rechnen".

      Conn.Execute ("select * from Tabelle where ID = x")

      Das funktioniert solange, wie die ID fortlaufend ohne Lücken vergeben ist. Wenn aber Lücken entstehen (und eine ID ist dafür gemacht, dass Lücken entstehen, wenn Datensätze gelöscht werden), dann versagt dein Ansatz.

      Die bessere Lösung setzt beim SQL-Befehl an.

      MySQL kann beispielsweise die Anzahl der auszugebenden Datensätze mit Limit beeinflussen:

      SELECT * FROM tabelle LIMIT 5 -> ergibt nur 5 Datensätze, sofern vorhanden.

      Das sollte man kombinieren mit einem Sortierbefehl, damit die Reihenfolge der Datensätze definiert ist (ansonsten kommen irgendwelche 5 Datensätze):

      SELECT * FROM tabelle ORDER BY id ASC LIMIT 5 -> ergibt die 5 Datensätze mit der kleinsten ID, also die "ersten".

      Die letzten Datensätze kriegt man, indem man die Sortierung einfach umdreht - statt aufsteigend (ASC) einfach absteigend (DESC) sortieren.

      Und als zweites: Der dann erste Datensatz soll übersprungen werden.

      SELECT * FROM tabelle ORDER BY id DESC LIMIT 2,5

      LIMIT 2,5: Starte beim 2. Datensatz und gib 5 Stück aus.

      Die Aufgabe wäre jetzt, herauszufinden, ob die tatsächlich verwendete Datenbank sowas wie LIMIT kennt, wie man das benutzt, und wie man sortiert.

      Ansonsten bliebe die Alternative, LIMIT wegzulassen, trotzdem umgekehrt zu sortieren und einfach nur die ersten 6 Datensätze einzulesen - der erste Datensatz wird dann weggeworfen, und die weiteren 5 sind die gewünschten.

      - Sven Rautenberg

      --
      "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
      1. Moin nochmal!

        Ich senke mein Haupt ja schon in Schande! :-) Das mit dem Dividieren war wirklich Blödsinn! Man glaube mir bitte, daß ich den Unterschied zwischen Dividieren und Subtrahieren kenne. Sonst nehmen sie mir vielleicht mein Diplom wieder weg. *lol*
        Der SQL-Befehl ist natürlich um Welten einfacher. :-)

        Bis denne...
        MarKX.

      2. Vielen Dank für deine wirklich tolle Erklärung. So macht lernen Spass :-) Aber genug gesülzt.

        Irgendwie funktioniert ds mit dem Limit nicht bei mir. Was könnte ich falsch machen?
        So siehts aus:
        SELECT * FROM Aenderung where anlage = '" + anlage + "' AND del = 'no' ORDER BY id DESC LIMIT 2,5

        Diese Fehlermeldung bekomme ich:
        Syntax error in ORDER BY clause

        Danke.

        1. Hi

          SELECT * FROM Aenderung where anlage = '" + anlage + "' AND del = 'no' ORDER BY id DESC LIMIT 2,5

          Die "+" durch "&" ersetzen. Das müßte dann funktionieren.

          MarkX.

        2. Moin!

          Irgendwie funktioniert ds mit dem Limit nicht bei mir. Was könnte ich falsch machen?
          So siehts aus:
          SELECT * FROM Aenderung where anlage = '" + anlage + "' AND del = 'no' ORDER BY id DESC LIMIT 2,5

          Diese Fehlermeldung bekomme ich:
          Syntax error in ORDER BY clause

          Wie ich schon sagte: LIMIT funktioniert bei der Datenbank MySQL - und du solltest klären, welche Datenbank du verwendest und was dort funktioniert. Lies die Doku dazu!

          Außerdem: Deine Fehlermeldung besagt, dass bei "ORDER BY" was falsch ist. Die Angabe "id" ist die Spalte, nach der du sortieren willst - also das, wonach sich entscheidet, welches die "letzten fünf" Einträge sind, die die Datenbank hat. Wenn du keine Spalte "id" hast, hast du natürlich einen Fehler.

          - Sven Rautenberg

          --
          "Bei einer Geschichte gibt es immer vier Seiten: Deine Seite, ihre Seite, die Wahrheit und das, was wirklich passiert ist." (Rousseau)
    3. Vom Prinzip her ein gute Idee, nur wie bekomme ich das in der Parxis hin? Habe jetzt schon jede menge erfolgloser Versuche hinter mir :-)

      mfg Stefan

  2. Ganz easy ist das, wenn Dein Table eine fortlaufende Nummer hat. Also einfach ein Feld mit der Eigenschaft auto_incement anlegen.

    und dann:
    SELECT * FROM tbl_name ORDER BY fortlaufendes_feld DESC LIMIT 1,5

    Frage beantwortet?

    Zeek

    1. SELECT * FROM tbl_name ORDER BY fortlaufendes_feld DESC LIMIT 1,5

      Wußt ich´s doch, daß es eine einfachere Lösung gibt als meine. *lol*

      MfG
      MarkX.

      1. SELECT * FROM tbl_name ORDER BY fortlaufendes_feld DESC LIMIT 1,5

        Leider funktioniert es bei mir nicht... Das mit dem LIMIT haut nicht hin. Mache ich etwas falsch?

  3. Hallo,

    Falls Du Access benutzt ist " TOP X " das Zauberwort,
    also:

    SELECT Top 5 * FROM tabelle ORDER BY id DESC

    Viele Gruesse aus dem Altmuehltal
    Michael Schneider

    info@asp-components.de
    www.asp-components.de

    Hallo,
    ich suche eine Möglichkeit, mittels eines SQL Befehls die letzten sechs Datensätze anzuzeigen, ohne den letzten Datensatz.

    Beispiel: Wenn mein DB 10 Einträge hat, möchte ich den Eintrag 5-9 anzeigen, wenn sie 100 Einträge hat, den Datensatz 95-99 usw.

    Vielen Dank, schon mal.
    mfg Stefan