Helen: Zufaellige Auswahl von Datensaetzen

Hallo,
folgendes Problem. Ich moeche mit PHP Datensätze per Zufall
aus einer MySql Datenbank holen. Ist ja soweit auch kein Problem.
Ich habe einmal einen Datenbankfetch gemacht, die Primaerschlussel in einen Array geschrieben und dann eine Zufallszahl zwischen 0 und der Arraylaenge geholt und so einen Datensatz aufgewaehlt.
Soweit so gut..

In jedem Datensatz gibt es ein Feld Names "Status". Hier stehen Zahlen von 1-10 drin. Nun moechte ich, dass um so hoeher der Status ist, um so seltener soll dieser Datensatz ausgewählt sein.

Ich hoffe es ist verstaendlich.. Viele gruesse

Helen

  1. Hallo,

    ich weiß ja nicht, wie groß deine Datensatzzahl ist, aber du könntest die Einträge (11-Status)-Mal in dein Array eintragen und dann so weitermachen wie bisher...

    MfG
    Rouven

    --

    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  2. Hi,

    In jedem Datensatz gibt es ein Feld Names "Status". Hier stehen Zahlen von 1-10 drin. Nun moechte ich, dass um so hoeher der Status ist, um so seltener soll dieser Datensatz ausgewählt sein.

    Die Idee von Rouven ist so schlecht nicht, aber auch wenn Speicher heutzutage nicht mehr gar so teuer ist ... ;-)

    Aber es reicht ja auch eine Art Bitmap (PHP ist nicht gerade berühmt dafür, gut rechnen zu können, deshalb erspare ich mir hier mal die mehr oder minder geschickten Algorithmen, die eine entsprechende Verteilungskurve erzeugen könnten ;-):

    // Verteilung bitte anpassen
    $bitm = '111111111122222222233333333 usw.';

    [DB Initialisierung snipped]

    mt_srand ((double) microtime() * (1000000));

    // strlen($bitm) bitte bei Gelegenheit durch passenden Integer ersetzen
    // (Wenn die Verteilung nicht passt ist es am billigsten in $bitm einige
    // Ziffern hinzuzufügen, oder zu entfernen)
    // Evt ist hier eine explizite Typumwandlung nach Integer nötig
    $randomstat =  mt_rand(0, strlen($bitm) );

    // Alle Zeilen mit einem zufällig (unter Berücksichtigug obiger Verteilungskurve) gewähltem "status"
    // markieren.
    // "ORDER BY ID" muß nicht unbedingt
    $result = mysql_query("SELECT * FROM $your_db WHERE status =  $bitm{$randomstat} ORDER BY id");

    // Eine zufällige Zeile daraus auswählen (mysql_affected_rows() ist die Anzahl
    // der gefundenen Zeilen)
    $randomrow =   mt_rand(0, mysql_affected_rows() );

    // Zeiger auf eine zufällig ausgewählte Zeile stellen und ausgeben
    // in $row sollte jetzt das Ergebnis sein, wenn alles korrekt ablief, oder besser:
    // wenn alles so lief, wie ich mir das vorgestellt hatte ;-)
    $row = mysql_data_seek ($result, $randomrow);

    Ich habe im Augenblick keine Gelegenheit (sprich: Zeit) das zu testen (Alle Typos gehören dem, der sie findet ;-), aber als Anregung sollte es genügen.

    so short

    Christoph Zurnieden