Luise: Zufallsabfrage MySQL mit Prioritäten

Liebes Forum,

momentan gebe ich meine Zufallsabfragen aus meine MySQL-DB folgendermassen aus:

SELECT * FROM  ".$table."WHERE id != '".$_COOKIE['lastSnipplet']."' AND status = '1' AND medium LIKE '%tv%' ORDER BY prioritaet*RAND() LIMIT 1

In der prioritaet-Spalte stehen Werte zwischen 0,1 und 0,9, wobei 0,1 eine hohe Wichtigkeit und 0,9 eine niedrigere hat.

Das funktioniert auch ganz gut.

Allerdings möchte ich dass Einträge mit gleichen Prioritäten, z.B. 0,5 auch gleich oft angezeigt werden.

Wird das durch prioritaet*RAND() automatisch sichergestellt? Was ist, wenn ein Eintrag mit z.B. 0,5 Priorität hinzukommt. Wird dieser dann erst so oft angezeigt, bis er einen genauso hohen Status hat wie die bereits angezeigten Einträge? Oder kann das prioritaet*RAND() nicht?

Brauche ich dafür noch eine zusätzliche Spalte, in der ich die Aufrufe zähle, z.B. "aufrufe"? Das nehme ich an, aber wie baue ich das dann in meine Abfrage so ein, dass wie gesagt z.B, alle 0,5-Priorität-Einträge (und natürlich alle anderen gleichen Priorität-Einträge auch) gleich oft angezeigt werden? Bei einem neuen Eintrag könnte ich ja dann die Spalte aufrufe zurücksetzen, oder?

Ganz lieben Dank für Suche Hilfe.

Eure Luise.:-)

  1. Hallo,

    Allerdings möchte ich dass Einträge mit gleichen Prioritäten, z.B. 0,5 auch gleich oft angezeigt werden.

    das widerspricht dem Wunsch nach einer "zufälligen" Auswahl. Du kannst dem Zufall durch eine Gewichtung nachhelfen, wie du es bereits tust - dann hast du bei sehr, sehr vielen Einzelereignissen ungefähr die statistische Häufung, die du haben möchtest.

    Wird das durch prioritaet*RAND() automatisch sichergestellt?

    Ja, bei genügend großer Anzahl von Ereignissen. Wenn du natürlich zwei Einträge hast, sagen wir, A mit 0.1 und B mit 0.9, dann kann es durchaus sein, dass bei 10 Versuchen 3x A und 7x B gezogen wird. Das ist halt so bei "Zufällen".

    Was ist, wenn ein Eintrag mit z.B. 0,5 Priorität hinzukommt. Wird dieser dann erst so oft angezeigt, bis er einen genauso hohen Status hat wie die bereits angezeigten Einträge? Oder kann das prioritaet*RAND() nicht?

    Nein. Echter Zufall kümmert sich nicht um das, was schon Vergangenheit ist. Die Wahrscheinlichkeit, mit einem idealen Würfel eine Sechs zu werfen, ist 1/6. Wenn du aber gerade eine Sechs hattest, ist die Wahrscheinlichkeit für eine weitere Sechs beim nächsten Wurf trotzdem wieder 1/6.

    Bei der technischen Realisierung von Zufallsgeneratoren gibt es zwar, wenn sie schlecht gemacht sind, den Effekt, dass die Folge der produzierten Zufallszahlen zwar chaotisch, aber immer gleich ist. Gut gemachte Zufallsgeneratoren mixen aber soviel Unvorhersehbares in die Berechnung, dass dieser Fall nicht auftritt - zumindest nicht offensichtlich.

    Brauche ich dafür noch eine zusätzliche Spalte, in der ich die Aufrufe zähle, z.B. "aufrufe"? Das nehme ich an, aber wie baue ich das dann in meine Abfrage so ein, dass wie gesagt z.B, alle 0,5-Priorität-Einträge (und natürlich alle anderen gleichen Priorität-Einträge auch) gleich oft angezeigt werden?

    "Gleich oft" ist, wie ich schon sagte, eine Forderung, die dem Zufallsprinzip widerspricht. Was du möchtest, ist aber den Gewichtungsfaktor umso kleiner werden lassen, je länger dieser Eintrag *nicht* aufgerufen wurde.

    Du könntest also anstatt "aufrufe" eine Spalte "aufrufzeit" hinzufügen, in die bei jedem erfolgreichen Aufruf die aktuelle Zeit eingetragen wird, und deinen Gewichtungsfaktor dividierst du zusätzlich durch die Zahl der seit dem letzten erfolgreichen Aufruf vergangenen Sekunden (oder Minuten, oder Stunden).

    Damit wird die Auswahl eines bestimmten Eintrags zusätzlich zu seinem festen Gewichtungsfaktor umso wahrscheinlicher, je länger er schon nicht mehr dran war.

    So long,
     Martin

    --
    Alle wollen unser bestes.
    Aber das kriegen sie nicht.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(