chrigu: letzter datensatz auslesen (mysql)

hallo zusammen,
ich möchte gerne aus einer tabelle den letzten datensatz auslesen wo eine bedingung zu triff (userid = $userid...)
kann ich das im sql-statment machen? oder muss ich das im php-code machen?

gruss chrigu

  1. Hi,

    ich möchte gerne aus einer tabelle den letzten datensatz auslesen wo eine bedingung zu triff (userid = $userid...)

    definiere den Begriff "letzter" in einer unsoriterten Menge. Welches ist der letzte Smartie in der Packung?

    kann ich das im sql-statment machen?

    Vermutlich ja, nach obiger Definition.

    Cheatah

    --
    X-Will-Answer-Email: No
    1. eintrag 1 (id=1)
      eintrag 2 (id=1)
      eintrag 3 (id=1)
      eintrag 4 (id=1)

      jetzt möchte ich nur eintrag 4 auslesen?! ach ja ich kann den datensatz nur an id=1 erkennen..

      gruss chrigu

      1. Hi,

        eintrag 2 (id=1)
        eintrag 4 (id=1)
        eintrag 3 (id=1)
        eintrag 1 (id=1)

        ich hab das mal richtig sortiert.

        jetzt möchte ich nur eintrag 4 auslesen?!

        Und der unterscheidet sich von den anderen dreien durch...?

        ach ja ich kann den datensatz nur an id=1 erkennen..

        Wenn Du irgendwelche Sortierungen vornehmen möchtest, musst Du dem Inhalt der Tabelle das entsprechende Sortierkriterium hinzufügen. Sollte sich Dein "der letzte" durch den Zeitpunkt definieren, ist dieser beispielsweise etwas, das in der Tabelle gespeichert werden muss. Nur durch ein Sortierkriterium lässt sich eine Reihenfolge festlegen - per se sind alle Datensätze _unsortiert_.

        Cheatah

        --
        X-Will-Answer-Email: No
        1. ok ich habe jetzt noch die zeit hinzugefügt. im stil von "14:00:00".. also den neusten datensatz?!

          danke

          1. Moin!

            ok ich habe jetzt noch die zeit hinzugefügt. im stil von "14:00:00".. also den neusten datensatz?!

            Datum plus Uhrzeit wäre besser gewesen, weil jeden Tag 14:00 Uhr ist.

            Und dann: Sortiere nach Datum/Uhrzeit absteigend. Du erhälst die Datensätze mit dem neuesten zuerst, alle späteren danach. Und nimm den _ersten_ Datensatz dieser Liste (z.B. mit LIMIT 1).

            - Sven Rautenberg

            --
            Diese Signatur gilt nur am Freitag.
            1. Moin!

              ok ich habe jetzt noch die zeit hinzugefügt. im stil von "14:00:00".. also den neusten datensatz?!

              Datum plus Uhrzeit wäre besser gewesen, weil jeden Tag 14:00 Uhr ist.

              Und dann: Sortiere nach Datum/Uhrzeit absteigend. Du erhälst die Datensätze mit dem neuesten zuerst, alle späteren danach. Und nimm den _ersten_ Datensatz dieser Liste (z.B. mit LIMIT 1).

              - Sven Rautenberg

              danke, habs jetzt so gelöst:
              SELECT VersuchID FROM tversuche WHERE UserID = 2 ORDER BY Datum DESC, aZeit DESC LIMIT 1

              gruss und grossen dank
              chrigu

              1. Hi,

                "14:00:00"
                Datum plus Uhrzeit wäre besser gewesen,

                genauer gesagt: Eine Spalte von einem Datums_typ_, nicht irgendein VARCHAR oder so. Genau dafür sind solche Typen schließlich da.

                danke, habs jetzt so gelöst:

                Ja, aber ich möchte meine obige Empfehlung aufrechterhalten :-) Mach aus den zwei Spalten eine, welche ein "sauberes" Datum enthält, keine Darstellungs-Repräsentation eines solchen.

                Cheatah

                --
                X-Will-Answer-Email: No
            2. Hallo Chrigu,

              Vorschlag:

              id mit auto_increment anlegen
              (dann zählt die ID automatisch hoch,
              auch wenn der letzt Datensatz dann gelöscht wird
              zählt mysql stur weiter)

              dann:

              select max(id) from table
              oder
              select last_insert_id() from table

              Gruesse Dacor

              1. Moin!

                Hallo Chrigu,

                Ich bin Sven.

                Vorschlag:

                id mit auto_increment anlegen
                (dann zählt die ID automatisch hoch,
                auch wenn der letzt Datensatz dann gelöscht wird
                zählt mysql stur weiter)

                Wenn die ID eindeutig Datensätze als "letzte" kennzeichnet, kann man das so machen. Was, wenn nicht?

                dann:

                select max(id) from table

                Das selektiert dir die höchste ID - aber nicht den ganzen Datensatz. Und den kriegst du außer in MySQL auch in keinem anderen Datenbanksystem auf diese Weise, weil du Aggregatfunktionen verwendest.

                oder
                select last_insert_id() from table

                last_insert_id() ist eine Funktion, die man direkt nach einem INSERT verwendet sollte, um die generierte Datensatz-ID herauszufinden, damit man sie in anderen Tabellen als Foreign-Key verwenden kann. Die Information darüber selektiert dir auch keinen Datensatz.

                - Sven Rautenberg

                --
                Diese Signatur gilt nur am Freitag.
                1. Hallo Chrigu, Hallo Sven, Hallo Cheata

                  select max(id) from table

                  Das selektiert dir die höchste ID - aber nicht den ganzen Datensatz. Und den kriegst du außer in MySQL auch in keinem anderen Datenbanksystem auf diese Weise, weil du Aggregatfunktionen verwendest.

                  oder
                  select last_insert_id() from table

                  last_insert_id() ist eine Funktion, die man direkt nach einem

                  das ist richtig,
                  select * from tabelle order by id desc limit 1
                  liefert z.B. den ganzen.

                  zur Datums, Uhrzeit- Speicherung:
                  der time() liefert Euch nur sekundengenaue Einträge,
                  da können schon mal 5 Einträge mit der gleichen Zeit
                  vorliegen (geht z.B. auch mit timestamp nicht besser).
                  D.h. auf die Weise ist im obigen Fall
                  es möglich Einträge zu erzeugen, die nicht angezeigt werden.
                  (Server ist allemal schnell genug Einträge in ein paar ms einzutragen).

                  Zusätzlich zu eindeutigen Userfeldern, die natuerlich fuer jeden Wert auch noch geprueft werden muessen, ne Auto-ID zu benutzen kann ich nur empfehlen (seit mysql 3.23.x gibts es damit immer die eindeutige Identifizierung, wieviel Datensaetze jemals in einer Tabelle bewegt worden sind).

                  Vieleicht gibts ja bald auch in mysql einen Unique-Identifier,
                  der wäre dann wirklich besser, da ich dann auch Tabellen von zwei Servern mit wenig Aufwand ... ach 42!

                  Gruesse Dacor

                  1. Hi,

                    der wäre dann wirklich besser, da ich dann auch Tabellen von zwei Servern mit wenig Aufwand ... ach 42!

                    Was war doch gleich die Frage?

                    Liebe Grüße aus http://www.braunschweig.de

                    Tom

                    --
                    Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
              2. Hi,

                id mit auto_increment anlegen

                eine solche Spalte hat *keinen* Zweck neben der Eindeutigkeit des enthaltenen Wertes. Gar keinen.

                Cheatah

                --
                X-Will-Answer-Email: No
            3. Hi,

              ok ich habe jetzt noch die zeit hinzugefügt. im stil von "14:00:00".. also den neusten datensatz?!

              Datum plus Uhrzeit wäre besser gewesen, weil jeden Tag 14:00 Uhr ist.

              Irgendwie hab ich das gestern schonmal gehört (dass 14:00 Uhr ist)

              Und dann: Sortiere nach Datum/Uhrzeit absteigend. Du erhälst die Datensätze mit dem neuesten zuerst, alle späteren danach. Und nimm den _ersten_ Datensatz dieser Liste (z.B. mit LIMIT 1).

              Au ja, dass kann ca. 90 bis 99% der Bearbeitungszeit sparen helfen.

              Noch intelligenter fände ich ja die Lösung, jeder Tabelle von Haus aud einen Primary Key auto_increment unique bigint usw. beizubiegen. Dann würde sich das mit der Reihenfolge und Uhrzeit erübrigen. [Das erinnert mich daran, dass mein Artikel mit dem Blättern in SQL-tabellen immer noch halbfertig hier herumliegt.]

              Liebe Grüße aus http://www.braunschweig.de

              Tom

              --
              Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
              1. Hi,

                Noch intelligenter fände ich ja die Lösung, jeder Tabelle von Haus aud einen Primary Key auto_increment unique bigint usw. beizubiegen. Dann würde sich das mit der Reihenfolge und Uhrzeit erübrigen.

                nein, würde es nicht. Du begehst einen Fehler, wenn Du einem auto_increment-Wert eine andere als wiederholungsfreie, jedoch *zufällige* Bedeutung beimisst. Der Wert dient *nur und ausschließlich* der Eindeutigkeit.

                Cheatah

                --
                X-Will-Answer-Email: No
                1. Hi Cheatah,

                  Noch intelligenter fände ich ja die Lösung, jeder Tabelle von Haus aud einen Primary Key auto_increment unique bigint usw. beizubiegen. Dann würde sich das mit der Reihenfolge und Uhrzeit erübrigen.

                  nein, würde es nicht. Du begehst einen Fehler, wenn Du einem auto_increment-Wert eine andere als wiederholungsfreie, jedoch *zufällige* Bedeutung beimisst. Der Wert dient *nur und ausschließlich* der Eindeutigkeit.

                  Das verstehe ich jetzt nicht. Werden denn autoincrement-Werte nicht der Reihe nach vergeben? Also der zuletzt neu eingetragene Datensatz hat den höchsten Wert, oder? Vorausgesetzt natürlich, dass man auch die Autoincrement-Funktion nutzt und nicht selber fummelt, wie dies z.B. bei MySL möglich ist. Aber das hat man ja in der Hand.

                  Bei Timestamp hätte ja der zuletzt veränderte Datensatz den aktuellsten Wert, der ist aber nich unbedingt zuletzt angelegt worden, sondern nur editiert.

                  Liebe Grüße aus http://www.braunschweig.de

                  Tom

                  --
                  Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
                  1. Hallo Tom,

                    Das verstehe ich jetzt nicht. Werden denn autoincrement-Werte nicht der Reihe nach vergeben? Also der zuletzt neu eingetragene Datensatz hat den höchsten Wert, oder? Vorausgesetzt natürlich, dass man auch die Autoincrement-Funktion nutzt und nicht selber fummelt, wie dies z.B. bei MySL möglich ist. Aber das hat man ja in der Hand.

                    auto_increment stellt nur sicher, dass die ID eindeutig ist. Dass das jetzt so implementiert ist, dass sich das automatisch hochzählt, ist unerheblich.

                    Bei Timestamp hätte ja der zuletzt veränderte Datensatz den aktuellsten Wert, der ist aber nich unbedingt zuletzt angelegt worden, sondern nur editiert.

                    Du könntest auch ein DATETIME nehmen und nur beim Einfügen NOW() reinschreiben.

                    Grüße,

                    Christian

                    --
                    Sollen sich alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen und nicht mehr davon erfasst haben als eine Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst.
                                          -- Albert Einstein
                    1. Hi Christian,

                      auto_increment stellt nur sicher, dass die ID eindeutig ist. Dass das jetzt so implementiert ist, dass sich das automatisch hochzählt, ist unerheblich.

                      Autoincrement heißt doch auf Deutsch übersetzt: selbsthochzählend. Das ist doch der Sinn der Funktion, dass man eine eindeutige Chronologie über diesen Primary Key erhält. Darum aärgere ich mich ja auch etwas über MySQL, dass man da nachträglich noch Schlüssel einfügen kann, die nicht mehr da sind.

                      Aber für das Problem von chrigu sollte der Autoincrement Primary Key die richtige Lösung sein. Alles Andere ist Bastelkram.

                      Liebe Weihnachtsgrüße aus http://www.braunschweig.de

                      Tom

                      --
                      Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.