Top-Einträge

  • Hey! Wie soll ich folgendes machen?


    Ich speichere bei einem Seitenbesuch den Browser eines Users.

    Nun möchte ich folgendes machen:

    Ich möchte ein Interface coden, wo die Top-Browser angezeigt werden. Sprich: Wenn 20 Einträge mit mit "Chrome" existieren und 19 mit "Opera", sowie 3 mit "Edge", soll dies als Liste angezeigt werden, also sprich:

    Platz 1 Chrome 20 Nutzer
    Platz 2 Opera 19 User

    and so on....


    Das ist ja soweit kein Problem. Jedoch sollen auch jederzeit komplett neue Browser hinzu kommen können, die dann gleichermaßen angezeigt werden sollen.

    Also sprich: Wenn auf einmal jemand neues mit "Safari" kommt, soll dies als Eintrag angezeigt werden. Es sollen halt am Ende alle Daten zusammengefasst werden (COUNT) und dann der Reihe nach angezeigt werden.


    Ich hoffe, das war soweit verständlich.:)

  • Erstmal danke für die schnelle Antwort, jedoch hatte ich mir das auch schon überlegt, jedoch geht das so leider nicht.

    Ich möchte nämlich, dass ebenfalls nach Zeitraum sortiert werden kann. So muss ich ja für jeden Eintrag ein Datum abspeichern.


    Also kann es nicht in einem Eintrag zusammengefasst werden.

  • Btw. UPDATE und INSERT zu verwenden ist im allgemeinen gar nicht notwendig, MySQL kennt REPLACE INTO, das macht genau das anhand des PrimaryKey.

    Hilft jetzt nicht bei der Datumsgeschichte, war nur als Hinweis gedacht.

  • MySQL kennt REPLACE INTO, das macht genau das anhand des PrimaryKey.

    Sicher? Laut Doku kann man damit kein Update machen:

    Zitat

    REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted.

  • Sicher? Laut Doku kann man damit kein Update machen

    Ja, sicher. ;)


    Es mag sein, dass es technisch betrachtet kein echtes UPDATE ist, aber das Ergebnis ist genau das, was man erwartet.

    Existiert eine Zeile bereits ( basierend auf PrimaryKey oder Unique Constraints ) erhält diese am Ende die aktualisierten Werte.

    Ob die nun zuvor entfernt wurde und mit neuen Werten neu eingefügt wurde, interessiert mich an der Stelle nicht.


    Ich nutze das in größeren Projekten seit langem und da gibt es keine Probleme.

    Wenn eine Zeile existiert, habe ich am Ende die neuen Werte in der Zeile stehen.

    Existiert diese nicht, habe ich eine neue Zeile mit den erforderlichen Werten.


    Für mich ist das daher ein UPDATE, auch wenn die Doku das etwas missverständlich schreibt.

    ;)


    Mit AutoIncrement ist das allerdings etwas unflexibler, geht aber in gewissem Rahmen auch.

  • Sollen User getracked werden, die registriert sind, oder alle User?

    Wenn alle, dann brauchst Du einen Browser-Fingerprint (Hab mich lange nicht mehr damit beschäftigt. Aber such mal im Netz).

    Anhand von dem Fingerprint (was ja am Ende ein Hash ist)

    kannst Du dann pro User n Einträge seines Browsers ect anlegen.


    Bsp.:

    Bei jedem Seitenaufruf prüfst Du, ob der Fingerprint in `anon_user` schon existiert - sonst anlegen.

    Bei jedem Seitenaufruf prüfst Du, ob der Browser in `browser` schon existiert - sonst anlegen.

    ---

    Jetzt könntest Du bei jedem Seitenaufruf in `anon_user_browser` eine neue Zeile einfügen.

    Dann hättest Du eine genaue Übersicht, welcher user mit welchem Browser reinkam.

    ABER das solltet Du nicht!

    Bei einem Angriff bei dem Deine Seite sehr oft aufgerufen wird, ist die Tabelle schnell voll.


    Du könntest das Ganze jetzt auf "pro Minute" oder "pro Stunde" runterdrücken.

    Aber das bedeutet (noch) mehr Aufwand.


    Wenn der Aufwand egal ist, dann:

    So, nu hättest Du also schon mal die Tabellen mit dem Browser und den Usern up-to-date.

    Geht evtl auch nocht sinnvoller.


    Du kannst ja jetzt aber nicht einfach immer wieder eine Zeile in `anon_user_browser` einfügen.

    Das erste, was mir da einfällt: Du brauchst es sicher nicht Sekundengenau.

    Also kannst Du das created_at schon mal runterdrücken auf "Jahr-Monat-Tag Stunde-Minute" (Y-m-d H:i).

    created_at könnte man dann auch umbenennen in ~"interval".


    Dazu kommt jetzt noch ein Feld `count`.

    Das Ziel:

    gibt es zu der momentanen Minute schon einen Eintrag, dann update den count +1.

    sonst insert new row mit count 1.


    Ob das Ganze jetzt Sinn macht (Aufwand<=>Nutzen), weiß ich nicht.

    Dieser Beitrag wurde bereits 1 Mal editiert, zuletzt von cottton () aus folgendem Grund: interval INSERT braucht sec zum Vergleichen