Linuchs: mySQL: Datensatz zuletzt gelesen

Moin,

habe gesucht, aber nicht gefunden. Gibt es eine Möglichkeit, einen Datensatz beim Lesen mit einem Zeitstempel zu versehen?

Hintergrund: Im Kalender wird pro Veranstalter zufällig mit RAND() eine seiner Hörproben-URLs gegriffen. Der Zufall hat es gerne, dass dieselbe Hörprobe mehrmals nacheinander „gefunden“ wird.

Besser wäre, die Funde immer eins weiterzuschalten, also den zu nehmen, der lange nicht dran war. Gerne würde ich mir nach dem SELECT einen weiteren Zugriff UPDATE sparen.

Ihr wisst ja - ich bin der Turbo-Freak. Es geht um hundertstel Sekunden.

Luxus-Problemchen: Wir nähern uns Weihnachten und die Weihnachtslieder sind mit Datum von Tag/Monat bis Tag/Monat gekennzeichnet. Also keine Heilige Nacht im Sommer.

Diese Lieder dürfen in ihrem Gültigkeitszeitraum eine höhere Priorität haben. Es wären auch Frühlingslieder denkbar, hatten wir aber noch nicht.

Gruß, Linuchs

  1. Hallo Linuchs,

    Hintergrund: Im Kalender wird pro Veranstalter zufällig mit RAND() eine seiner Hörproben-URLs gegriffen. Der Zufall hat es gerne, dass dieselbe Hörprobe mehrmals nacheinander „gefunden“ wird.

    Das können durchaus verschiedene Besucher sein. ⇒ Jeder hört was anderes.

    Besser wäre, die Funde immer eins weiterzuschalten, also den zu nehmen, der lange nicht dran war. Gerne würde ich mir nach dem SELECT einen weiteren Zugriff UPDATE sparen.

    Das können durchaus verschiedene Besucher sein. ⇒ Jeder hört dasselbe.

    Bilde die Summe aus 60 × aktueller Minute und aktueller Sekunde modulo Anzahl relevanter Hörproben und liefere die entsprechende Hörprobe aus.

    Bis demnächst
    Matthias

    --
    Du kannst das Projekt SELFHTML unterstützen,
    indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
    1. Hallo Matthias,

      den habe ich nicht verstanden:

      Das können durchaus verschiedene Besucher sein. ⇒ Jeder hört dasselbe.

      Gerne dürfen hunderte Besucher dasselbe hören, aber bei deren nächsten Zugriff muss was anderes kommen. Okay, wenn fünf Besucher den Zeitstempel weiterschalten, kann der nächste dieser fünf wieder „sein“ Lied erwischen.

      Das schätze ich aber als wesentlich seltener ein als dieses Würfeln mit RAND().

      Gruß, Linuchs

      1. Hallo Linuchs,

        Gerne dürfen hunderte Besucher dasselbe hören, aber bei deren nächsten Zugriff muss was anderes kommen. Okay, wenn fünf Besucher den Zeitstempel weiterschalten, kann der nächste dieser fünf wieder „sein“ Lied erwischen.

        Du willst für jeden deiner Besucher speichern, welche Hörprobe welchen Anbieters sie zuletzt gehört haben??

        Bis demnächst
        Matthias

        --
        Du kannst das Projekt SELFHTML unterstützen,
        indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
        1. Hallo Matthias,

          Du willst für jeden deiner Besucher speichern, welche Hörprobe welchen Anbieters sie zuletzt gehört haben??

          Nein, ich möchte nur die Hörproben möglichst ausschalten, die kürzlich gefunden wurden.

          Stelle dir Roulette oder einen Würfel vor. Die Treffer-Zahlen werden hinten angestellt und scheiden aus für den nächsten Wurf.

          Wo gibt es sowas in der Praxis? Bei Losen. Hast du einen Gewinn gezogen, ist dieser Gewinn nicht mehr in der Trommel.

          Gruß, Linuchs

          1. Hallo

            Du willst für jeden deiner Besucher speichern, welche Hörprobe welchen Anbieters sie zuletzt gehört haben??

            Nein, ich möchte nur die Hörproben möglichst ausschalten, die kürzlich gefunden wurden.

            dann musst du dir merken, welche Proben der jeweilige Besucher in welcher Reihenfolge schon gehört hat. Dann hast du auch sichergestellt, dass der Besucher irgendwann alle Proben kennt.

            Du könntest die Proben auch unabhängig vom jeweiligen Besucher in irgendeiner Reihenfolge ausliefern, dann ist aber nicht sichergestellt, dass nicht doch mal eine Doublette ausgeliefert wird.

            Also nochmal: Willst du irgendwo speichern, welche Proben der Besucher schon kennt?

            Gruß
            Jürgen

            1. Hallo Jürgen,

              Also nochmal: Willst du irgendwo speichern, welche Proben der Besucher schon kennt?

              Statistische Betrachtung:

              Ich habe für jedes Mitglied einen Zähler, der monatlich bei 0 (Zahl Null) beginnt. Unser Top-Mitglied Brunsbüttel hat monatlich knapp 3000 Zugriffe, also verteilt auf 30 Tage je 100 pro Tag.

              Edit: Okay, Beispiel hinkt, weil die nun gerade keine Hörproben haben, also ist das Angebot von Hörproben noch seltener.

              Die wieder verteilt auf 24 Stunden (ja, auch nächtliche Bots werden gezählt) macht alle 14 Minuten einen Zugriff. Dann möge der Besucher irgendwas bekommen, ich denke nicht, dass er Protokoll führt und sich beklagt.

              Aber derjenige, der die Seite nach kurzer Zeit neu lädt, soll etwas anderes hören. Ich selbst möchte prüfen, ob die Hörproben wechseln.

              So kompliziert ist das doch nicht.

              Linuchs

              1. Hallo Linuchs,

                Aber derjenige, der die Seite nach kurzer Zeit neu lädt, soll etwas anderes hören.

                Das kannst du nur sicherstellen, wenn du speicherst, welche Hörproben der Benutzer schon gehört hat.

                Du könntest aber alle relevanten Hörproben-IDs in zufälliger Reihenfolge in den session-storrage laden und immer die erste Hörprobe ausliefern und den ersten Eintrag löschen.

                Bis demnächst
                Matthias

                --
                Du kannst das Projekt SELFHTML unterstützen,
                indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
                1. Oder er speichert die zuletzt gehörte[n] Hörprobe[n] in der Session.

                  Außerdem muss ggf. die Abfrage wiederholt werden, wenn rand() den oder einen bereits gespeicherten Wert auswirft.

                  Lösung: Das Randomizing im PHP ausführen. Im Extremfall die IDs aller Hörproben shuffeln, in einem Array in der Session ablegen - sodann immer den ersten rausziehen und wenn der Array leer ist, neu füllen.

                  • Kein Insert, kein Update in der Datenbank und die Speicherung erfolgt per Benutzer - besser gehts nicht.

                  Einziges Manko: Das Session-Cookie… Außerdem muss ggf. die Abfrage wiederholt werden, wenn rand() den oder einen gespeicherten Werte auswirft. Lösun

                  1. Hallo Raketen-X,

                    Lösung: Das Randomizing im PHP ausführen. Im Extremfall die IDs aller Hörproben shuffeln, in einem Array in der Session ablegen - sodann immer den ersten rausziehen und wenn der Array leer ist, neu füllen.

                    im local storage. Dann klappts auch mehrere unabhängige Aufrufe im selben Browser.

                    • Kein Insert, kein Update in der Datenbank und die Speicherung erfolgt per Benutzer - besser gehts nicht.

                    Ebent.

                    Einziges Manko: Das Session-Cookie…

                    Nö.

                    Außerdem muss ggf. die Abfrage wiederholt werden,

                    Sie muss dann erneuert werden, wenn im local storage nicht Passendes mehr drin ist oder die Hörprobe ungültig ist. Außerdem könnte man noch ein flag setzen, das dafür sorgt, dass der local storage neu befüllt wird, wenn neue Hörproben hinzukommen.

                    Bis demnächst
                    Matthias

                    --
                    Du kannst das Projekt SELFHTML unterstützen,
                    indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
    2. Hallo Matthias,

      Bilde die Summe aus 60 × aktueller Minute und aktueller Sekunde modulo Anzahl relevanter Hörproben und liefere die entsprechende Hörprobe aus.

      So einen selbstgemachten „Zufall“ habe ich bereits ausprobiert, er ist nicht wesentlich besser als RAND().

      Genaugenommen möchte ich keinen Zufall mehr. Stelle dir vor, ich müsste hungernden Leuten per Zufall Essen austeilen. Der Nächste darf würfeln. Der Eine bekommt dann drei Portionen nacheinander und der Andere darf sich wieder hinten anstellen.

      Es muss möglich sein, so eine Verteilung gerechter zu machen als per Zufall.

      Gruß, Linuchs

      1. Hallo Linuchs,

        der Vergleich hinkt, weil bei dir dieselbe Person beliebig oft hintereinander stehen kann.

        Bis demnächst
        Matthias

        --
        Du kannst das Projekt SELFHTML unterstützen,
        indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
  2. Hallo Linuchs,

    was Matthias Dir sagen will: Wenn deine Datenbank 100 Anfragen bekommt, weiß sie nicht, ob das 100 Anfragen von einem User oder je eine Anfrage von 100 Usern waren.

    Du möchtest deine "Derandomisierung" aber pro User haben. Oder? Das geht nur, wenn Du pro User speicherst, was er wann schon gehört hat. Und wenn er alle schon gehört hat, dann kannst Du ihm die jeweils älteste vorspielen.

    Fallgrube: Datenschutz

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo Rolf,

      Du möchtest deine "Derandomisierung" aber pro User haben. Oder?

      Nicht nötig. Ich möchte nur erreichen, dass der User beim wiederholten Aufruf der Seite möglichst eine andere Hörprobe angeboten bekommt.

      Dass inzwischen andere User den Zeitstempel für die nächste Hörprobe dieses Mitglieds weitergeschaltet haben, ist extrem unwahrscheinlich.

      Da die Diskussion auf einem Nebengleis endet (nett, dass ihr mitdenkt, aber das habe ich nicht gefragt), denke ich, es gibt keine Lösung auf DB-Ebene, die beim Lesen eines Datensatzes das Lesedatum im Satz vermerkt.

      Linuchs

      1. Hallo Linuchs,

        Da die Diskussion auf einem Nebengleis endet (nett, dass ihr mitdenkt, aber das habe ich nicht gefragt),

        Du bist doch lange genug dabei um zu wissen, dass wir dich gern von Irrwegen abholen. 🤪

        Bis demnächst
        Matthias

        --
        Du kannst das Projekt SELFHTML unterstützen,
        indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
  3. https://forum.selfhtml.org/self/2020/nov/12/dringend-hilfe-gesucht-zufalliger-bildwechsel-beim-aktualisieren-einer-seite/1777895#m1777895

    @Linuchs :

    Eine der Möglichkeiten der Lösung Deines Problems.