Xynon: letzte zeile auslesen

Hi,

Wie kann ich mit einem SQL-Query oder per PHP den letzten Datensatz aus einer mysql tabelle auslesen?

Ich treffe in foren immer nur auf
SELECT COUNT(*) FROM table_name;
aber was ist wenn ein Datensatz gelöscht ist und die Tabelle nur noch 199 datensätze hat, dann ist die letzte ID immer noch 200 und
SELECT LAST(column_name) FROM table_name
wie hier funktioniert nicht, da kommt immer die Fehlermeldung:
#1064 - You have an error in your SQL syntax;

Wahrscheinlich weil es LAST in mysql nicht gibt, wenn ich mich nicht irre.

Was gebe es noch für möglichkeiten?

mfg Xynon

  1. Hallo,

    Wie kann ich mit einem SQL-Query oder per PHP den letzten Datensatz aus einer mysql tabelle auslesen?

    definiere "letzter Datensatz".

    aber was ist wenn ein Datensatz gelöscht ist und die Tabelle nur noch 199 datensätze hat, dann ist die letzte ID immer noch 200 und

    Ist es der mit der höchsten ID?

    SELECT LAST(column_name) FROM table_name
    wie hier funktioniert nicht, da kommt immer die Fehlermeldung:
    #1064 - You have an error in your SQL syntax;

    Wahrscheinlich weil es LAST in mysql nicht gibt, wenn ich mich nicht irre.

    Nachgucken wäre eine Idee.

    Was gebe es noch für möglichkeiten?

    Die übliche, ein Subselect:

    SELECT                     -- Gib mir  
        *                      -- den Datensatz  
    FROM                       -- aus  
        table_name t1          -- meiner Tabelle (angesprochen unter dem Alias t1),  
    WHERE                      -- wobei  
        t1.ID = (              -- die ID dieses Datensatzes gleich  
            SELECT             -- der  
                MAX(t2.ID)     -- größten ID  
            FROM               -- aus  
                table_name t2  -- dieser Tabelle (zur Unterscheidung mit t2 angesprochen)  
        )                      -- sein soll.
    

    Ich möchte noch anmerken, dass eine ID nur dazu da sein sollte, einen Datensatz eindeutig zu identifizieren - und darüber hinaus keine weitere Information tragen sollte. Auch nicht, welcher Datensatz der neueste ist. Verwende dazu eine eigene Spalte.

    Freundliche Grüße

    Vinzenz

  2. Wahrscheinlich weil es LAST in mysql nicht gibt, wenn ich mich nicht irre.

    Ungeachtet Vinzenz' Post glaube ich, dass du das Äquivalent zu TOP/LAST suchst - das wäre in MySQL die LIMIT-Optimierung.

    Bez. der Reihung "neuere oder älterer Datensatz" stimme ich Vinzenz zu: hierfür muss ein anderes Merkmal definiert werden - ein Zeitstempel zb - die Reihung selbst kann über ein anderes Feld gesteuert werden.

    Wie eine ID vergeben wird, liegt im ermessen des Systems - üblicherweise werden von einem DBMS gelöschte IDs nicht wiederverwertet und per AUTO_INCREMENT einfach immer weiter hochgezählt, aber da ist noch lange keine Garant, dass ein Datensatz mit höhrere ID auch tatsächlich später eingefügt wurde.

    Das kann besonders bei Zeitumstellungen oder beim Umdatieren von Datensätzen der Fall sein.

    1. Hi,

      @suit

      Wie eine ID vergeben wird, liegt im ermessen des Systems - üblicherweise werden von einem DBMS gelöschte IDs nicht wiederverwertet und per AUTO_INCREMENT einfach immer weiter hochgezählt, aber da ist noch lange keine Garant, dass ein Datensatz mit höhrere ID auch tatsächlich später eingefügt wurde.

      Das wusste ich schon und es ging ja auch nicht darum welcher Datensatz als letzter hinzugefügt wurde sondern welcher der letzte in der Tabelle ist.

      Also ist die Lösung die du per LIMIT vorgeschlagen und Andi noch mal hingeschrieben hat genau das was ich suchte.

      mfg Xynon

      1. Das wusste ich schon und es ging ja auch nicht darum welcher Datensatz als letzter hinzugefügt wurde sondern welcher der letzte in der Tabelle ist.

        Nochmal fürs Protokoll (aka Archiv): der Datensatz mit der höchsten ID muss nicht jener sein, der als letzter ausgegeben wird, wenn alle Datensätze ohne Kriterien abgefragt werden.

        In MySQL ist es möglich, eine Tabelle einmalig, permanent nach irgned einem Kriterium zu sortieren - z.B. eine Stammdatentabelle nach Vorname. Wenn das gemacht wurde, ist die ID selbst "durcheinander" und der letzte Datensatz in dieser Reihung mit hoher Wahrscheinlichkeit nicht mehr jener mit der höchsten ID.

        1. Hi,

          Nochmal fürs Protokoll (aka Archiv): der Datensatz mit der höchsten ID muss nicht jener sein, der als letzter ausgegeben wird, wenn alle Datensätze ohne Kriterien abgefragt werden.

          Ja, ich weiß, aber dies ist dem php-script nicht wichtig, um das noch mal klar zustellen,
          ich habe Schaltflächen die nur die ID wechseln und danach den Datensatz ausspucken wenn die ID nicht vorhanden ist dann wird diese übersprungen, das Ziel war z.B Tabelle 200 Datensätze und man springt vom 198 auf 199 der aber nicht mehr exisiert so soll er den überspringen.
          Bis dahin kein Problem, aber existiert Datensatz 200 nicht mehr so würde er prüfen ob die Datensätze 201,202,203,usw. existieren, und das soll unterbunden sein so das wenn man einen Datensatz nach "rechts" bzw. "unten" geht
          dann der letzte Datensatz angezeigt wird.

          Ich hoffe das erklärt das ein bisschen besser.

          mfg Xynon

  3. Ich denke, ich würde es mit

      
    Select *  
    FROM table  
    ORDER BY id DESC  
    limit 1  
    
    

    versuchen.

    Also der letzte Datensatz, so sagt es mir meine Logik.