Ankündigung

Einklappen
Keine Ankündigung bisher.

Rating mit Datenbank

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Rating mit Datenbank

    Hi Leute,
    also was ich machen will ist ein Banner rating. Ich erklär das mal lieber genauer bevor ich zur Frage komme. Es soll so sein das ich in der Datebnank alle Werbebanner aufgelistet hab. Jeweils ein Attribut ist ein Rating Wert. z.B.

    Banner 1 - banner1.jpg - 75
    Banner 2 - banner2.jpg - 25

    Die 75 und 25 sind jeweils Prozente. Das heißt wenn ich nachher eine Ausgabe mache dann muss der Banner 1 zu 75% dem anderen bevorzugt werden und der Banner 2 muss zu 25% ausgegeben werden. Sozusagen eine Prioritätszuordnung nach Prozenten statt nach Werten wie 1, 2, 3.

    Wie setzte ich nun die Ausgabe um? Gibt es da eine SQL interne Funktion die ich nutzen könnte oder muss man da etwas eigenes machen und wenn ja wie soll ich das angehen bzw. machen?

    Thx im vorraus, Broadcast!

  • #2
    kann mir denn keiner Helfen

    Kommentar


    • #3
      Lies doch die Ratings sortiert in einen Array und erstellt dann eine Zufallszahl.

      PHP-Code:
      <?php
      $sql 
      "SELECT id, rating FROM banner ORDER BY rating ASC"// rating
      $res mysql_query($sql);
      $rating = array();
      while (
      $cur mysql_fetch_assoc($res)) {
        
      $rating[] = $cur// alle einlesen
      }
      $rand rand(1,100); // 1 - 100 (Banner mit Rating 0 kommen nie dran)
      $counter 0;
      for (
      $i 0$i count($rating); $i++) {
        
      $counter += $rating[$i]['rating']; // Ratings addieren
        
      if ($counter >= $rand) { // Counter übersteigt Zufallszahl?
          
      $chosenBanner $rating[$i]; // nimm ihn
          
      break;
        }
      }
      displayBanner($chosenBanner); // zeig Banner an
      ?>

      Kommentar


      • #4
        thx, hab da ne frage zu diesem Code, funzt das auch wirklich wie nenn Rating denn per Zufall dürfen die ja nicht angezeigt werden sondern müssen strengstens nach Rating gehen!

        Kommentar


        • #5
          Prinzipiell schon, denn jeder Banner erhält ja einen anteiligen "Bereich" (natürlich müssen alle Ratings zusammen 100 ergeben).
          Beispiel: Wir haben 3 Banner: Banner25a, Banner25b und Banner50.
          Banner25a bekommt praktisch den Bereich 1-25,
          Banner25b den Bereich 26-50,
          Banner50 den Bereich 51-100 an Zahlen zugeordnet.

          Die jetzt erstellte Zufallszahl (zwischen 1 und 100) wird also einem Bereich zugeordnet (durch den Counter).

          Sagen wir die Zufallszahl ist öh 73, dann wird in der Schleife geschaut oder 25 (Banner25a) > 73.
          Nein ist es nicht, ist 25 + 25 (Banner25b) > 73?
          Nein auch noch nicht. Ist 25 + 25 + 50 (Banner50) > 73? Jupp, also werden alle Zufallszahlen von 1-25 dem Banner25a, 26-50 Banner25b und 51-100 dem Banner50 zugeordnet.

          Das dürfte doch genau sein was du willst?

          Kommentar


          • #6
            Jope naja fast!

            Nehmen wir an ich habe 3 Banner:

            (A) Rating: 25%

            (B) Rating: 50%

            (C) Rating: 100%


            Nun sollen ja nach deinem Prinzip die Zufallszahlen ermittelt werden. Nun hab ich z.B. die Zufallszahl 23 dann kann mir der Banner (A), (B), (C) angezeigt werden. In deinem Beispiel wird mir nur Banner (A) angezeigt. Die Prozentwerte sind sozusagen die Priorität. Das schwere daran ist das ein Random Wert nicht weis was Priorität ist. Denn wenn ich die Zufallszahl 64 hab dann kann der mir auch alle Banner ausgeben aber eben nach Priorität (rating). Es soll sozusagen der Banner (C) dem Banner (A) und (B) vorgezogen werden und der Banner (B) dem Banner (A) und Banner (A) ist die letzte Auswahl.

            Denn in meinem Beispiel kann bei der Zahl 23 eben auch alle 3 Banner angezeigt werden. Das ist schwer zu erklären und daher auch die Schwierigkeit beim Programmieren von dem teil.

            Gibts da eventuell ne Möglichkeit nach meinem Beispiel?

            Gruß Broadcast

            Kommentar


            • #7
              Wie kann ein Banner das Rating 100% haben? Prozent komt nehme ich an von Percent, also pro hundert. Deine Ratings ergeben aber 175%. Das macht keinen Sinn. Dann lass die % Angabe weg, das verwirrt nur.

              Und dann erweiter den Zufallszahlen-Bereich eben auf rand(1, SUMME_ALLER_RATINGS);
              Ich verstehe das Problem nicht.
              Natürlich wird die 23 immer Banner A mit Rating 25 zugeordnet, aber 23 ist ja zufällig. Und die Wahrscheinlichkeit, dass eine Zufallszahl mit rand(1, 175) in den Zahlenbereich 1-25 fällt ist eben (25 / (25 + 50 + 100)) und damit eben ~14%. Anteilig eben.
              Für Banner B ist die Wahrscheinlichkeit dann ~29% und für Banner C eben grob 57%.

              Lass das Skript doch 10.000x durchlaufen und zähl nen Counter hoch, welche Banner gewählt wurden, dann siehste das Skript funktioniert.

              Oder hab ich dich komplett falsch verstanden?


              Edit: Was heißt denn vorziehen bei dir? Du willst doch einen Banner einfach öfter anzeigen als einen anderen?

              Kommentar


              • #8
                Angenommen, du hast eine Tabelle `banner`
                mit folgenden Attributen: `id`, `bezeichnung`, `rating`.

                Dann könntest du dieser Tabelle ein weiters Attribut `anzahl_angezeigt`
                mit dem Startwert 0 hinzufügen.

                Du hättest dann evtl. folgendes:
                Code:
                 id | bezeichnung | rating | anzahl_angezeigt
                 1 -  banner1.jpg -   10   -   0
                 2 -  banner2.jpg -   20   -   0
                 3 -  banner3.jpg -   30   -   0
                 4 -  banner4.jpg -   40   -   0
                Nach jeder Anzeige eines Banners wird die jeweilige Feld `anzahl_angezeigt`
                um 1 incrementiert.
                Es können nur Banner angezeigt werden, wo folgende Formel zutrifft (anzahl_angezeigt < rating).

                Wenn für alle Banner folgende Formel zutrifft (anzahl_angezeigt = rating),
                muss `anzahl_angezeigt` wieder auf 0 gesetzt werden:

                Etwa nach folgendem Muster:
                Code:
                <?php
                
                $sql = "SELECT COUNT(*)
                FROM banner
                WHERE anzahl_angezeigt < rating";
                
                $res = mysql_query($sql);
                
                if (mysql_result($res, 0) == 0) {
                
                   $sql = "UPDATE banner SET anzahl_angezeigt = 0";
                   $res = mysql_query($sql);
                }
                else {
                
                   $sql = "SELECT id, bezeichnung
                   FROM banner
                   WHERE anzahl_angezeigt < rating
                   ORDER BY RAND()
                   LIMIT 1";
                
                   $res = mysql_query($sql);
                
                   $banner_ID = mysql_result($res, 'id');
                   $banner    = mysql_result($res, 'bezeichnung');
                
                   $sql = "UPDATE banner SET anzahl_angezeigt = anzahl_angezeigt + 1 WHERE id = $banner_ID";
                   $res = mysql_query($sql);
                
                   echo "hier den $banner anzeigen";
                }
                ?>
                ~dilemma~

                ps:
                wenn ich dich richtig verstanden habe...

                Kommentar


                • #9
                  Dann werden am Anfang alle gleichoft angezeigt und gegen Ende nurnoch die mit höherem Rating, bis es zum Reset kommt.

                  Kommentar


                  • #10
                    Nachtrag:
                    Vielleicht wäre dann folgende Abfrage sinnvoller,
                    um eine dem rating entsprechende Rotation zu erreichen:
                    Code:

                    $sql = "SELECT id, bezeichnung
                    FROM banner
                    WHERE anzahl_angezeigt < rating
                    ORDER BY (anzahl_angezeigt / rating) ASC /* anstatt ORDER BY RAND() */
                    LIMIT 1";

                    ~dilemma~

                    Kommentar


                    • #11
                      Du hast doch aber mit dem anzahl_angezeigt dann pro Aufruf ein MySQL-Statement mehr (nämlich UPDATE) als bei meinem Skript.
                      Was spricht also gegen meine Lösung, die auch noch jedes mal zufällig aber immernoch das Rating berücksichtigend funktioniert?
                      (andererseits ist es natürlich egal ob es zufällig oder pseudozufällig wie bei deinem Skript ist, aber ein MySQL-Statement mehr oder weniger finde ich schon relevant, es ist ja immerhin eine Halbierung der MySQL-Statements )

                      Kommentar


                      • #12
                        Ausgehend von folgendem Inhalt der Tabelle `banner`,
                        die fortlaufend 'geupdatet' wird:
                        Code:
                         id | bezeichnung | rating | anzahl_angezeigt
                         1 -  banner1.jpg -   10   -   0
                         2 -  banner2.jpg -   20   -   0
                         3 -  banner3.jpg -   30   -   0
                         4 -  banner4.jpg -   40   -   0
                        ... ergibt sich bereits nach 10-maliger Ausführung meines Scripts
                        durch folgende Abfrage:
                        Code:
                           $sql = "SELECT id, bezeichnung
                           FROM banner
                           WHERE anzahl_angezeigt < rating
                           ORDER BY (anzahl_angezeigt / rating) ASC, rating DESC
                           LIMIT 1";
                        ... für die einzelnen Banner folgende Anzeige-Häufigkeit:
                        banner1: 1x
                        banner2: 2x
                        banner3: 3x
                        banner4: 4x
                        ... Und das ist dann NICHT 'pseudozufällig', sondern entspricht dem gewollten 'rating'!

                        So hatte ich die Frage von Broadcast verstanden.
                        ~dilemma~

                        Kommentar


                        • #13
                          Mit pseudozufällig meinte ich die Reihenfolge des Anzeigens, welche sich bei dir nicht ändert. Wie gesagt ist das aber halbwegs irrelevant. Finde meine Lösung trotzdem besser, wegen der Anzahl der SQL-Statements und weil ich tatsächliche Zufälligkeit unter Einbeziehung des Ratings einfach besser finde.

                          Kommentar

                          Lädt...
                          X