Sascha: Ausgabe der letzten SQL Einträge

Hallo,

ich möchte in einem rss-Feed die letzten (z.b. 10) Einträge aus meiner MYSQL DB ausgeben. Meine Einträge beinhalten allerdings bisher kein Datum oder ähnliches. Kennt jemand ein SQL Statement, das einem diese Selektion ermöglicht?

Grüße
Sascha

  1. Hallo,

    ich möchte in einem rss-Feed die letzten (z.b. 10) Einträge aus meiner MYSQL DB ausgeben. Meine Einträge beinhalten allerdings bisher kein Datum oder ähnliches. Kennt jemand ein SQL Statement, das einem diese Selektion ermöglicht?

    ja, SELECT in Verbindung mit LIMIT.

    Grüße, Matze

    1. Hi,

      ja, SELECT in Verbindung mit LIMIT.

      das liefert die letzten Einträge einer (Pseudo-)Zufallssortierung. Die Datensätze einer Tabelle *sind unsortiert*, benötigen also die Angabe eines Sortierungskriteriums, wenn man ein solches wünscht.

      Cheatah

      --
      X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
      X-Will-Answer-Email: No
      X-Please-Search-Archive-First: Absolutely Yes
      1. Hallo,

        ja, SELECT in Verbindung mit LIMIT.

        das liefert die letzten Einträge einer (Pseudo-)Zufallssortierung. Die Datensätze einer Tabelle *sind unsortiert*, benötigen also die Angabe eines Sortierungskriteriums, wenn man ein solches wünscht.

        richtig. Da ich aber nur weiß was er _nicht_ hat ("Datum o.ä."), kann ich ihm keine Sortierung vorschlagen. Ich weiß ja nicht wie seine Tabelle aussieht, ob sie eine Spalte mit auto_increment hat usw. usf.

        Grüße, Matze

        1. Hi,

          richtig. Da ich aber nur weiß was er _nicht_ hat ("Datum o.ä."), kann ich ihm keine Sortierung vorschlagen.

          nein, aber Du kannst ihm vorschlagen, dieses Fehlende hinzuzufügen.

          Ich weiß ja nicht wie seine Tabelle aussieht, ob sie eine Spalte mit auto_increment hat usw. usf.

          auto_increment dient dem Setzen von IDs. IDs haben *nur und ausschließlich* den Zweck, ein Eindeutigkeitskriterium zu liefern. In dem Begriff "Eindeutigkeitskriterium" besitzt der Wortteil "Sortierung" ein geradezu erschreckendes Maß an Nichtexistenz[1]. Somit kann (darf!) eine auto_increment-Spalte bezüglich des aktuellen Problems keinerlei Nutzen bieten.

          Cheatah

          [1] Selbst "Skrotum" ist hier deutlich existenter, und damit hat die Geschichte hoffentlich überhaupt nichts zu tun :-)

          --
          X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
          1. Hallo,

            Ich weiß ja nicht wie seine Tabelle aussieht, ob sie eine Spalte mit auto_increment hat usw. usf.

            auto_increment dient dem Setzen von IDs. IDs haben *nur und ausschließlich* den Zweck, ein Eindeutigkeitskriterium zu liefern. In dem Begriff "Eindeutigkeitskriterium" besitzt der Wortteil "Sortierung" ein geradezu erschreckendes Maß an Nichtexistenz[1]. Somit kann (darf!) eine auto_increment-Spalte bezüglich des aktuellen Problems keinerlei Nutzen bieten.

            doch. Ich kann selbstverständlich eine "Sortierung" alà SELECT * FROM table ORDER BY id DESC LIMIT 10 vornehmen. Was sollte daran verkehrt sein? Die Frage ist nur, ob die Reihenfolge dann die gewünschte ist. Könnte sie aber durchaus sein wenn ich mir z.B. die letzten 10 Einträge eines Gästebuches anzeigen lassen will.

            Grüße, Matze

            1. Ihr habt 4 mal gepostet während ich mir über eine gute Antwort gedanken gemacht hab ;). Post kam um 15:10 wenn ihr mal kurz nachsehen wollt, hehe

              Grüße
              Sascha

              1. Hallo,

                Ihr habt 4 mal gepostet während ich mir über eine gute Antwort gedanken gemacht hab ;). Post kam um 15:10 wenn ihr mal kurz nachsehen wollt, hehe

                guck an, und das obwohl ich nebenbei noch ganz andere Sachen mache.
                Vielleicht wirst du langsam langsam^^

                Grüße, Matze

            2. yo,

              Die Frage ist nur, ob die Reihenfolge dann die gewünschte ist. Könnte sie aber durchaus sein wenn ich mir z.B. die letzten 10 Einträge eines Gästebuches anzeigen lassen will.

              zum einen sollten pk schlüssel keine fachlichkeit beinhalten, das hat dir aber schonCheatah gesagt. zum anderen lieegt die betonung auif könnte, muss aber nicht. besser ist immer ein weg, wo ich 100% sicher bin, das ich auch das richtige bekomme.

              Ilja

              1. Hallo,

                zum einen sollten pk schlüssel keine fachlichkeit beinhalten, das hat dir aber schonCheatah gesagt. zum anderen lieegt die betonung auif könnte, muss aber nicht. besser ist immer ein weg, wo ich 100% sicher bin, das ich auch das richtige bekomme.

                ich bin mir 100% sicher, dass ich mit der vorgeschlagenen Lösung die letzten 10 Einträge einer Tabelle mit einer auto_increment Spalte ausgeben kann. Das der PK nicht speziell dafür gedacht ist, stört mich ehrlich wenig solange es funktioniert. Es gibt sicher andere Möglichkeiten aber warum?

                Grüße, Matze

                1. Hallo

                  ich bin mir 100% sicher, dass ich mit der vorgeschlagenen Lösung die letzten 10 Einträge einer Tabelle mit einer auto_increment Spalte ausgeben kann.

                  Nein, noch nicht einmal das. Nicht immer. Eine Spalte mit einem DATETIME-Wert
                  ist dafür genau das richtige.
                  Erst recht nicht im aktuellen Fall - auch wenn hier vermutlich ein Fehler im
                  Datenbankdesign vorliegt: Wie kriegst Du mit Autoincrement die 10 neuesten Datensätze, die sich auf mehrere Tabellen verteilen?

                  Ich zitiere Sascha (15:10):

                  Zweites Problem. Es ist nicht eine Tabelle, sondern es sind 8. Aus dieses 8 Tabellen möchte ich die letzten 10 hinzugefügten Einträge selektieren.

                  Es ist ganz einfach eine gute Idee, IDs nicht für solche Zwecke zu missbrauchen.
                  Genauso wie es eine schlechte Idee ist, IDs lückenlos halten zu wollen.

                  Die meisten DBMS, auch MySQL, bieten die Möglichkeit, in eine Spalte den Zeitpunkt der Erstellung automatisch einzutragen.

                  Warum sollte man es nicht richtig[tm] machen, wenn es ganz einfach und ohne
                  großen Aufwand geht?

                  Freundliche Grüße

                  Vinzenz

                  1. Hallo,

                    ich bin mir 100% sicher, dass ich mit der vorgeschlagenen Lösung die letzten 10 Einträge einer Tabelle mit einer auto_increment Spalte ausgeben kann.

                    Nein, noch nicht einmal das. Nicht immer. Eine Spalte mit einem DATETIME-Wert
                    ist dafür genau das richtige.

                    und was gibt mein Beispiel bei 1(!) Tabelle deiner Meinung nach dann aus?

                    Erst recht nicht im aktuellen Fall - auch wenn hier vermutlich ein Fehler im
                    Datenbankdesign vorliegt: Wie kriegst Du mit Autoincrement die 10 neuesten Datensätze, die sich auf mehrere Tabellen verteilen?

                    Dieses Problem lag beim OP noch nicht vor :)

                    Es ist ganz einfach eine gute Idee, IDs nicht für solche Zwecke zu missbrauchen.

                    Touché! Ich geb mich in dem Fall geschlagen. Bei nur 1 Tabelle rück ich von meinem Standpunkt aber nicht ab :)

                    Warum sollte man es nicht richtig[tm] machen, wenn es ganz einfach und ohne
                    großen Aufwand geht?

                    Ich hab nie behauptet es wäre schwer oder ein "großer Aufwand".
                    IMHO aber überflüssig solange es sich um nur eine Tabelle handelt.

                    Ich hoffe der OP liest noch mit.

                    Grüße, Matze

                    1. yo,

                      IMHO aber überflüssig solange es sich um nur eine Tabelle handelt.

                      nein, auch bei einer tabelle würde ich davon abraten. du setzt vorraus, dass die sortierung der id schlüssel immer im zusammenhang mit dem datum des insert übereinstimmt. davon würde ich nicht ausgehen.

                      und zum anderen was machst du, wenn ein datensatz nur aktualisiert (update) wird, dann ändert sich die id ja nicht.

                      der ansatz ist letztlich ein anderer, benutze ich den pk für fachlichkeiten, kann ich immer auf probleme stossen. benutze ich dafür eine extra datumsspalte, werde ich nie auf probleme stossen. warum also auf etwas behaaren, wenn es eine bessere lösung gibt ?

                      Ilja

                      1. Hallo,

                        IMHO aber überflüssig solange es sich um nur eine Tabelle handelt.
                        nein, auch bei einer tabelle würde ich davon abraten. du setzt vorraus, dass die sortierung der id schlüssel immer im zusammenhang mit dem datum des insert übereinstimmt. davon würde ich nicht ausgehen.

                        in meinen gesamten bisherigen Beispielen habe ich ein Gästebuch als "Täter" benannt. Dabei können sicher zeitgleiche Einträge vorhanden sein. Diese lassen sich anhand der id unterscheiden. Davon geh ich aus!

                        und zum anderen was machst du, wenn ein datensatz nur aktualisiert (update) wird, dann ändert sich die id ja nicht.

                        Und? Ich bin immernoch bei einem Gästebuch.

                        der ansatz ist letztlich ein anderer, benutze ich den pk für fachlichkeiten, kann ich immer auf probleme stossen. benutze ich dafür eine extra datumsspalte, werde ich nie auf probleme stossen. warum also auf etwas behaaren, wenn es eine bessere lösung gibt ?

                        Es gibt für mein Beispiel keine bessere, sondern höchstens eine andere Lösung. Und auf der beharre ich, richtig.

                        Grüße, Matze

                        1. Hallo nochmal,

                          Es gibt für mein Beispiel keine bessere, sondern höchstens eine andere Lösung. Und auf der beharre ich, richtig.

                          Jetzt hab ich mich auch noch selbst überlistet^^
                          Nee, ich beharre auf meiner Lösung, nicht auf der anderen. :P

                          Grüße, Matze

                        2. yo,

                          in meinen gesamten bisherigen Beispielen habe ich ein Gästebuch als "Täter" benannt. Dabei können sicher zeitgleiche Einträge vorhanden sein.

                          und wie willst du mit einer id festhalten, wann welcher eintrag im gästebuch gemacht wurde ?

                          Ilja

                          1. Hallo,

                            in meinen gesamten bisherigen Beispielen habe ich ein Gästebuch als "Täter" benannt. Dabei können sicher zeitgleiche Einträge vorhanden sein.

                            und wie willst du mit einer id festhalten, wann welcher eintrag im gästebuch gemacht wurde ?

                            na mit einer Datums-Spalte. Dabei können aber verschiedene Einträge das selbe Datum haben, deshalb sortier ich nach id.

                            Grüße, Matze

                            1. yo,

                              na mit einer Datums-Spalte. Dabei können aber verschiedene Einträge das selbe Datum haben, deshalb sortier ich nach id.

                              das datum ist die sortierung. es kann dabei egal sein, ob die werte gleich sind, dann muss ich nichts weiter tun. oder aber es ist nicht egal, dann füge ich einen timestamp hinzu.

                              die id kann und soll diese funktionalitzät nicht übernehmen. spätenstens bei migrationen wird das schief gehen, in aller regel aber auch schon vorher.

                              Ilja

                              1. Hallo,

                                hör bitte auf!

                                na mit einer Datums-Spalte. Dabei können aber verschiedene Einträge das selbe Datum haben, deshalb sortier ich nach id.
                                das datum ist die sortierung. es kann dabei egal sein, ob die werte gleich sind, dann muss ich nichts weiter tun. oder aber es ist nicht egal, dann füge ich einen timestamp hinzu.

                                Sicher, eine Spalte mit Datum und eine mit timestamp... Wird dir da nicht selbst irgendwas klar?

                                die id kann und soll diese funktionalitzät nicht übernehmen.

                                Du "plapperst" nach ohne eine Begründung zu nennen.

                                spätenstens bei migrationen wird das schief gehen, in aller regel aber auch schon vorher.

                                Meinem Beispiel nach nicht.

                                Grüße, Matze

                2. Hi,

                  zum einen sollten pk schlüssel keine fachlichkeit beinhalten, das hat dir aber schonCheatah gesagt. zum anderen lieegt die betonung auif könnte, muss aber nicht. besser ist immer ein weg, wo ich 100% sicher bin, das ich auch das richtige bekomme.
                  ich bin mir 100% sicher, dass ich mit der vorgeschlagenen Lösung die letzten 10 Einträge einer Tabelle mit einer auto_increment Spalte ausgeben kann.

                  nur weil eine Spalte auto_increment hat, heißt das nicht, daß keine Einträge außerhalb der Reihe existieren.

                  Lege eine neue Tabelle an mit einer id-Spalte, die auto_increment hat.

                  Führe ein oder ein paar  insert into tabelle (id) values (0);         aus. (benutzt den auto_increment wegen der 0)
                  Führe ein                insert into tabelle (id) values (31415925);  aus. (benutzt den auto_increment NICHT, da id nicht 0)
                  Führe ein oder ein paar  insert into tabelle (id) values (0);         aus. (benutzt den auto_increment wegen der 0)

                  Führe ein select from tabelle order by id desc limit 1; aus.

                  Du wirst den Datensatz mit id 31415925 bekommen. Dies ist nicht der zuletzt eingefügte.

                  cu,
                  Andreas

                  --
                  Warum nennt sich Andreas hier MudGuard?
                  O o ostern ...
                  Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    2. Hallo,

      ich möchte in einem rss-Feed die letzten (z.b. 10) Einträge aus meiner MYSQL DB ausgeben. Meine Einträge beinhalten allerdings bisher kein Datum oder ähnliches. Kennt jemand ein SQL Statement, das einem diese Selektion ermöglicht?

      ja, SELECT in Verbindung mit LIMIT.

      Grüße, Matze

      ok, Limit hab ich soweit glaube ich verstanden. Ich verstehe trotzdem noch nicht, wie ich das für meine Zwecke einsetze.
      Meine Einträge haben weder ein Datum noch eine ID nach der ich sortieren könnte. Und selbst wenn ich eine ID hätte, mir die ID des letzten EIntrags hole, davon 10 abziehe und dann die Einträge bis zum Ende mittels LIMIT ausgebe, stellt sich mir die Frage: Was passiert, wenn zufällig die (MAX ID - 10) ID fehlt weil der Eintrag gelöscht wurde?

      Zweites Problem. Es ist nicht eine Tabelle, sondern es sind 8. Aus dieses 8 Tabellen möchte ich die letzten 10 hinzugefügten Einträge selektieren.

      Eine Lösung die mir in den Sinn kommt, wäre eine neunte Tabelle, in die jeder Eintrag immer mit ID geschrieben wird und aus der nichts gelöscht werden kann. Das hört sich aber nicht besonders elegant an.

      Grüße
      Sascha

      1. Hallo,

        ok, Limit hab ich soweit glaube ich verstanden. Ich verstehe trotzdem noch nicht, wie ich das für meine Zwecke einsetze.
        Meine Einträge haben weder ein Datum noch eine ID nach der ich sortieren könnte. Und selbst wenn ich eine ID hätte, mir die ID des letzten EIntrags hole, davon 10 abziehe und dann die Einträge bis zum Ende mittels LIMIT ausgebe, stellt sich mir die Frage: Was passiert, wenn zufällig die (MAX ID - 10) ID fehlt weil der Eintrag gelöscht wurde?

        also mal langsam. Ich hab es bereits Cheatah geschrieben.
        Also der SELECT-Teil sollte klar sein. Dann drehst du die Reihenfolge um (DESC) und zum Schluss nimmst du mit LIMIT 10 die Einträge. Welche ID und ob dazwischen welche fehlen ist völlig egal.

        Bsp.: Tabelle

        content | id
        ------------
        bla     | 0
        blub    | 4
        blob    | 7
        blib    | 9

        SELECT * FROM Tabelle ORDER BY id DESC LIMIT 3

        gibt blob blub bla in der Reihenfolge zurück.
        MAX brauchst du also gar nicht.

        Wenn du keine Spalte id hast, leg eine an :)

        Grüße, Matze

        1. yo,

          gibt blob blub bla in der Reihenfolge zurück.

          ich tippe auf blib, blob, blub

          Ilja

          1. Hallo,

            gibt blob blub bla in der Reihenfolge zurück.

            ich tippe auf blib, blob, blub

            sorry, natürlich. Sollte ja auch so sein.
            Ich habe "blib" nachträglich hinzugefügt, damit ich auf 4 komme.
            LIMIT 3 wäre bei nur 3 Einträgen arg albern gewesen^^
            Habs dann unten vergessen zu ändern.

            Grüße, Matze