Kermit: Nächster Eintrag nach Datum?

Hallo,
stehe anscheinend gerade auf dem Schlauc und brauche mal eine ANregung.
Lese aus einer MySql Datenbank einen Eintrag aus, der ist versehen mit ID, Text und Datum.
Nun möchte ich bei der Ausgabe ein Link setzen der mir den nächsten Eintrag ausgibt. Dabeihabe ich zwei kleinere Probleme:
a) die ID und das Datum müssen nicht gleichlaufend hochgezählt werden (sprich ich kann auch irgendwann einen Text eingegeben haben mit einem zurückliegenden Datum - kann also nicht einfach sagen wähle nächste ID)
b) zum gleichen Datum können mehrere Texte vorliegen und zwischen den Einträgen können unterschiedliche Zeitintervalle liegen (also nicht einfach nächster Tag)

angezeigter Eintrag
select text, id , datum from tabelle where id=id
echo akt.text
echo akt.id
echo akt.datum...

auswahl für den nächsten Eintrag
select text, id, datum from tabelle where datum>=akt.datum and id!=akt.id order by datum limit 1

macht in meinen Augen keinen wirklichen Sinn, da nicht zwangsläufig der nächste Eintrag gewählt wird wenn zu einem Datum mehrere Datensätze vorhanden sind, oder?! Besonders wenn ich dann wieder weitergehe und mir von der zweiten Ausgabe den nächsten Datensatz ansehen will, ist die Wahrscheinlichkeit hoch, daß mir der erste Datensatz wieder angezeigt wird.

Hoffe das ganze ist nicht zu kryptisch.
Wäre dankbar, wenn ihr mir hier etwas auf die Sprünge helfen könntet.
Danke,
Kermit

  1. Das was du brauchst, ist beispielsweise eine Threadid -- ich gehe mal davon aus, dass du an einem Forensystem oder so einer Art bastelst. Du brauchst ja, wenn du einen Thread ausliest, irgendeinen Bezug, der dir sagt, dass die bestimmten Posts zu Thread X gehören. Oder ist das etwa ID?
    Also ich habe bis jetzt ID immer nur als eindeutige ID verwendet, sodass sie nicht doppelt vorkommen können.

    Gruß
    Chris

    1. Das was du brauchst, ist beispielsweise eine Threadid -- ich gehe mal davon aus, dass du an einem Forensystem oder so einer Art bastelst. Du brauchst ja, wenn du einen Thread ausliest, irgendeinen Bezug, der dir sagt, dass die bestimmten Posts zu Thread X gehören. Oder ist das etwa ID?
      Also ich habe bis jetzt ID immer nur als eindeutige ID verwendet, sodass sie nicht doppelt vorkommen können.

      Gruß
      Chris

      Hallo Chris,
      Die IDs sind eindeutig und können nicht doppelt vorkommen aber es kann sein, daß ein Eintrag vom 01.01.08 Id 215 hat der vom 02.01.08 ID 216 und der vom 03.01.08 ID 212 - weil dieser Eintrag früher vorgenommen wurde aber in der Chronologie später stattfindet - und dann wieder ein Eintrag für den 01.01.08 mit der ID 217 . Sollte zwar nicht passieren, aber man muß ja auf alle Eventualitäten vorbereitet sein...
      Das ganze soll ein Blog werden, kein Forum.
      Grüße,
      Kermit

      1. Die IDs sind eindeutig und können nicht doppelt vorkommen aber es kann sein, daß ein Eintrag vom 01.01.08 Id 215 hat der vom 02.01.08 ID 216 und der vom 03.01.08 ID 212 - weil dieser Eintrag früher vorgenommen wurde aber in der Chronologie später stattfindet - und dann wieder ein Eintrag für den 01.01.08 mit der ID 217 .

        Das habe ich schon verstanden, aber geht doch wohl einfach darum, dass dein System auch wissen muss, welche Beiträge beispielsweise zu dem Artikel gehören, d.h. sie brauchen eine ErkennungsID oder so etwas, mit dem man weiß, dass sie zur dem Artikel gehören, oder?
        Oder soll das System raten, welche Artikel dazu gehören?

        Ein Beispiel für die Tabelle "artikel" (das musst nicht zwangsweise mit deinem Blogsystem übereinstimmen):
        +-----+-----------------+------------+--------------+
        | ID  |      TITEL      |    DATUM   |  NACHRICHT   |
        +-----+-----------------+------------+--------------+
        | 0   | test            | 01.03.2006 | sdhafuihsdaf |
        | 1   | Das Haus        | 04.03.2006 | dsafhuwerui  |
        | 2   | quietsche Ente  | 27.03.2006 | jdsafh       |
        | 3   | selfHtml        | 06.05.2006 | iouvaiodv    |
        | 4   | Google ist toll | 19.05.2006 | qwoieiuafn   |
        ------------------------+------------+--------------+
        Und deine Tabelle für (beispielsweise Kommentare für die Artikel):
        +-----+-----------------+------------+-----------+
        | ID  |    KOMMENTAR    |    DATUM   | ARTIKELID |
        +-----+-----------------+------------+-----------+
        | 0   | dsifh           | 04.03.2006 |     0     |
        | 1   | iusdzvuzdsav    | 04.03.2006 |     0     |
        | 2   | asiuhsduvha     | 03.04.2006 |     2     |
        | 3   | asd asfqr       | 07.05.2006 |     3     |
        | 4   | adsqwrafsad asd | 10.05.2006 |     4     |
        ------------------------+------------+-----------+

        Es gibt also eine Spalte mit der ARTIKELID, die auf die passende ID in der artikel-Tabelle verweist.
        Du kannst also sagen, dass der Kommentar "dsifh" und "iusdzvuzdasv" beide zum Artikel "test" gehören.
        Ich bin mir nämlich nicht sicher, wie du sonst festellen willst, welcher Kommentar zu dem Artikel gehört, verstehst du?

        Gruß
        Chris

        1. Hallo Chris,
          das Problem ist viel banaler, die Info kommt einfach nur aus einer Tabelle, ich brauche nur die Sortierung innerhalb der Tabelle um zu sagen lese ARtikel 1 dann klick auf weiter und lese Artikel 2 etc. bzw. eben auch zurück

          +----+----------+---------+-------+
          | ID | DATUM    | TEXT    | etc   |
          +----+----------+---------+-------+
          | 0  |2008-01-01|Text 1   |
          +----+----------+---------+
          | 1  |2008-01-02|Text 2   |
          +----+----------+---------+
          | 2  |2007-12-31|Text 3   | - da ist mir noch was zum 31.12. eingefallen
          +----+----------+---------+
          | 3  |2008-01-01|Text 4   | - und hier zum 01.01.
          +----+----------+---------+
          | 4  |2008-01-05|Text 5   |
          +----+----------+---------+

          Jetzt wähle ich z.B. Text 2 zur Ausgabe dann möchte ich ein Link "vorhergender Text" und ein Link "nächster Text"
          AUSGABE:

          2008-01-02
                                            TEXT 2 (id1)
                                 vorhergender text - nächster text
                                       |                     |
                         Text4(id 3) <--                     --> Text 5 (id4)
                              | |                               |      |
                  Text1(id0)<-  ->Text2 (id1)      Text 2(id1)<-       -> was auch immer
                       |
          Text3(id2)<-

          • vorhergender Text wäre also Text 4 oder 1(und je nachdem welcher Text gewählt wird dann vorhergend wieder 4 o. 1) also hier schon das Problem der nicht Eindeutigkeit
          • nächster Text wäre Text 5
            kann aber nicht wählen Datum +1 Tag oder ID +1 (bzw natürlich -1 je nachdem in welche Richtung ich gehe) oder Datum > oder < oder ID > oder <
            Verstehst Du das Dilemma?
            Ok, man könnte natürlich hergehen und sagen wenn gleiches Datum dann sortiere nach ID - da gäbe es zwar immer wieder die Problematik daß die Reihenfolge falsch ist, aber zumindest nur innerhalb des einen Tages...
            Man könnte natürlich auch eine Spalte Sortierung einfügen, aber die müßte dann bei jedem Eintrag der nicht chronologisch gemacht wird überarbeitet werden.

          Grüße,
          Kermit

          1. Wie gesagt, ich weiß wie du das meinst.

            Du hast sicherlich eine Tabelle für Artikel. Und das was du gerne noch hinzufügen möchtest, sind Kommentare? (Diese haben dann doch eine eigene Tabelle?)

            Gruß
            Chris

            1. Wie gesagt, ich weiß wie du das meinst.

              Du hast sicherlich eine Tabelle für Artikel. Und das was du gerne noch hinzufügen möchtest, sind Kommentare? (Diese haben dann doch eine eigene Tabelle?)

              Gruß
              Chris

              Nein, eben keine Kommentare - das wäre ja kein Problem wie Du schon sagtest über eine zweite Tabelle und dann die Verknüpfungen zum Text erstellen.
              Sondern weitere original Artikel die ganz simple in die richtige Reihenfolge gebracht werden müssen und nacheinander ausgelsen werden sollen, ohne Doppelung: select 1 artikel mit id irgendwas. Naächtse Seite seelct nächsten artikel. Wenn ich das simple nach Datum ordne, kann es mir passieren, daß wenn ich zwei oder mehr Artikel mit dem gleichen Datum habe, der nächste ARtikel der aufgerufen wird, schonmal dargestellt wurde und das möchte ich vermeiden.

              Grüße,
              Kermit

              1. Ach so. Ich dachte die ganze Zeit du willst Kommentare oder so etwas erstellen, da es meiner Meinung nach eher wenig Sinn macht, den Vorgänger eines bearbeitenden Artikels zu behalten.

                Also ohne Vergleiche, dir dir sagen, dass es sich dabei um den selben Artikel handelt, funktioniert nicht.
                Du kannst ja zusätzlich eine Spalte oder so anfügen mit Inhalt 1 oder 0 sagen, ob das ein alter, oder ein neuer Artikel ist.
                Andernfalls sehe ich leider keine Möglichkeit.

                (Es befindet sich doch auch bei der bearbeiteten Version der ganze Artikel drin, oder?)

                Gruß
                Chris

                1. (Es befindet sich doch auch bei der bearbeiteten Version der ganze Artikel drin, oder?)

                  Gruß
                  Chris

                  Hi Chris,
                  nein, es würde sich komplett um einen neuen Artikel handeln, der aber dem gleichen Datum zugeordnet werden muß. Ich weiß das ist alles sehr verwirrend und sollte in real-life auch nicht vorkommen, aber da es sich um eine Eingabemöglichkeit für einen anderen Anwender handelt muß ich diesen Sonderfall berücksichtigen (es handelt sich allerdings nur um einen expliziten Anwender der die Einträge machen kann). Ist also nur für den Fall zu berücksichtigen, daß der Anwender einen Fehler macht und nicht einfach den Artikel unter dem besonderen Datum bearbeitet sondern einen oder zwei, drei neue Artikel anlegt aus welchen Gründen auch immer (da möchte ich eine neue Überschrift für, das gehört zwar noch zum gleichen Datum aber zu einem anderen Kapitel, etc. etc.)
                  Grüße,
                  Kermit

  2. Hi,

    Lese aus einer MySql Datenbank einen Eintrag aus, der ist versehen mit ID, Text und Datum.
    Nun möchte ich bei der Ausgabe ein Link setzen der mir den nächsten Eintrag ausgibt.

    Dann uebergebe doch einfach das Datum des aktuellen Eintrages - und nehme dir dann von allen Eintraegen mit kleinerem Datum, aufsteigend sortiert nach Datum, den ersten.
    WHERE, ORDER BY, LIMIT.

    b) zum gleichen Datum können mehrere Texte vorliegen

    Dann musst du dir fuer den Fall ein weiteres Sortierkriterium ueberlegen (sofern "Datum" nicht auch eine Uhrzeit beeinhaltet, und die dann das ganze eindeutig macht).

    MfG ChrisB

    1. b) zum gleichen Datum können mehrere Texte vorliegen

      Dann musst du dir fuer den Fall ein weiteres Sortierkriterium ueberlegen (sofern "Datum" nicht auch eine Uhrzeit beeinhaltet, und die dann das ganze eindeutig macht).

      MfG ChrisB

      Hi Chris,
      genau das ist mein Problem: welches weitere Sortierkriterium ich nehmen kann denn die ID kann ja größer oder kleiner sein, also kommt das nicht in Frage. Uhrzeit ist nicht hinterlegt... Irgendeinen guten Vorschlag?
      Besonderes Problem wenn mehr als zwei Artikel unter gleichem Datum zu finden sind (sonst könnte man ja einfach die ID mit übergeben und sagen neue ID ungleich alter ID).

      GRüße,
      Kermit

      1. echo $begrüßung;

        genau das ist mein Problem: welches weitere Sortierkriterium ich nehmen kann denn die ID kann ja größer oder kleiner sein, also kommt das nicht in Frage. Uhrzeit ist nicht hinterlegt... Irgendeinen guten Vorschlag?

        Wenn du selbst nicht sagen kannst, welches die richtige Reihenfolge ist, wer soll es dir dann sagen? In dem Fall kannst du auch einfach die ID als zweites Sortierkriterium missbrauchen. ASC/DESC spielt ja dann auch keine Rolle. Das ist die einzige Möglichkeit eine bei jedem Sortiervorgang eindeutige Reihenfolge zu gewährleisten.

        Wie bekommt man nun den vorigen und den nächsten Datensatz? Ohne Kopfstände gar nicht. Es gibt keinen einfachen Mechanismus, von einem Datensatz aus eine beliebige Anzahl davor und/oder danach zu wählen. Die einzige anhand einer Position wählende Klausel ist LIMIT. Der kann man aber nur einen absoluten Startwerte anhand der Position in der Ergebnismenge übergeben. Der Wert muss auch noch unveränderlich sein. Er kann durch MySQL nicht berechnet werden. Es gibt auch keinen Zeilenzähler für Ergebnismengen. Und man weiß die Position einer bestimmten ID in einer Ergebnismenge erst, wenn man sie beim Auslesen selbst mitzählt.

        Mir fällt da nur ein,

        ... WHERE datum >= $datum AND ID > $aktID ORDER BY datum ASC, ID ASC LIMIT 1

        für den nachfolgenden und

        ... WHERE datum <= $datum AND ID < $aktID ORDER BY datum DESC, ID DESC LIMIT 1

        für den vorhergehenden Datensatz zu verwenden.

        An diesem Beispiel sieht man mal wieder, dass eine ID als Sortierkriterium ungeeignet ist. Doch hier muss der Teufel in seiner Not dann wohl doch Fliegen fressen.

        Eine andere Idee wäre, einen Paging-Mechanismus mit LIMIT zu implementieren. Dann könntest du, statt über die ID die Datensätze zu suchen, anhand der Seitenzahl die Datensatzmenge berechnen. Doch auch hier brauchst du ein eindeutiges Sortierkriterium. Der Vorteil wäre aber, dass du keine drei (einzelnen oder UNIONierten) Anfragen auf die DB loslassen musst.

        echo "$verabschiedung $name";

        1. Hallo,

          Eine andere Idee wäre, einen Paging-Mechanismus mit LIMIT zu implementieren. Dann könntest du, statt über die ID die Datensätze zu suchen, anhand der Seitenzahl die Datensatzmenge berechnen. Doch auch hier brauchst du ein eindeutiges Sortierkriterium. Der Vorteil wäre aber, dass du keine drei (einzelnen oder UNIONierten) Anfragen auf die DB loslassen musst.

          ja das habe ich mir auch schon überlegt - wird mir wohl nichts anderes übrigbleiben - aber das ist ja auch nur eine Notlösung falls falsche Einträge vorliegen.... da muß der Daten-Eingeber halt besser darauf achten (zumindest geht dann der Eintrag nicht verloren auch wenn er eventl. an der falschen Stelle erscheint....)

          Danke an euch alle!

          Kermit