Abfrage zufälliger Datensätze mit zusätzlichen Zufallskriterien

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

  • Abfrage zufälliger Datensätze mit zusätzlichen Zufallskriterien

    Hallo,

    für mein Projekt benötige ich eine Abfrage, die zufällige Zeilen liefert unter Angabe bestimmter Parameter.

    Ich gehe für dieses Posting von einer Beispiel-Tabelle mit folgenden Attributen aus:

    int: id
    int: typ (kann drei verschiedene Werte annehmen)
    int: status (kann drei verschiedene Werte annehmen)
    int: punkte

    Die Abfrage zufälliger Zeilen aus dieser Tabelle stellt allein kein Problem dar.

    Allerdings sollen dabei noch folgende Kriterien berücksichtigt werden:

    Mit Hilfe von Slidern soll der Benutzer eine Gewichtung für die Attribute "typ" und "status" festlegen können.
    Er soll zum Beispiel festlegen können:
    - Das zufällige Ergebnis soll 50% Datensätze mit typ=1 enthalten, 25% mit typ=2 und die restlichen 25% mit typ=3.
    Selbiges soll gleichzeitig auch für "status" festlegbar sein.

    Dabei ist gleichzeitig entweder die Anzahl zufällig zu generierender Zeilen wählbar oder eine Gesamtpunktzahl. In letzterem Fall sollen so viele Datensätze zufällig ausgelesen werden, dass die Spalte "punkte" in der Summe die angegebene Punktzahl erreicht.

    Ich überlege nun, wie ich diese Anforderung am Besten und auch einigermaßen performant umsetzen kann.

    MySQL-spezifische Funktionen fallen heraus, da das Projekt PEAR:B nutzt, und eine Datenbankumstellung zu einem späteren Zeitpunkt nicht ausgeschlossen ist.

    Gibt es hier überhaupt Möglichkeiten, bei der eigentlichen Datenbankabfrage bereits mehr als das reine zufällige Auslesen von Zeilen zu erreichen? In diesem Fall müsste ich den Algorithmus komplett in PHP realisieren, was mir auch noch etwas Kopfschmerzen bereitet. Hat jemand eine ähnliche Anforderung vielleicht schon einmal umgesetzt? Oder gibt es vielleicht eine fertige Lösung für ein Problem dieser Art?

    Vielen Dank für die Hilfe und viele Grüße
    Mahavishnu

  • #2
    ich denke, du wirst nichts fertiges finden.

    du kannst ja vorher mit php (o.ä.) eine ganze zahl generieren, die die anzahl der ergebnisse bestimmen soll (wenn das nicht schon anders bestimmt wird), davon die prozentualen anteile bestimmen und die anzahl der einzelnen abfragen wie gewohnt beschränken:
    Code:
    SELECT ... WHERE `typ` = 1 ORDER BY RAND() LIMIT $n

    Kommentar


    • #3
      Hallo, vielen Dank für die Antwort ersteinmal!

      Wenn es bei den Zusatzkritierien nur um den "typ" geht, hast du Recht!
      Genau auf diese Art und Weise hätte ich es ebenfalls gemacht.

      Soll allerdings gleichzeitig noch die prozentuale Abhängigkeit zum Attribut "status" hergestellt werden, komme ich auf diese Weise leider nicht mehr weiter. Ebenfalls berücksichtigt es nicht das Problem mit der "Punktesumme", da ich über die Punktesumme leider nicht auf die Anzahl der erforderlichen Zeilen zurückschließen kann.

      Viele Grüße
      Mahavishnu

      Kommentar


      • #4
        Soll allerdings gleichzeitig noch die prozentuale Abhängigkeit zum Attribut "status" hergestellt werden [...]
        könntest du das evtl. anhand einfacher beispieldaten veranschaulichen?
        Ebenfalls berücksichtigt es nicht das Problem mit der "Punktesumme" [...]
        lass uns das als ein separates problem behandeln (so wie ich das verstanden habe, ist es auch eins).

        ich kenne keine möglichkeit, mit sql so viele datensätze auszulesen, so dass die summe über eine spalte eingehalten wird. muss die summe exakt eingehalten werden? auch hier wären beispieldaten angebracht.

        Kommentar


        • #5
          ich könnte mir eine lösung ind der richtung vorstellen:

          PHP-Code:
          $result_limit "30";

          $type[0] = 30//
          $type[1] = 50// Von Formular %
          $type[2] = 20//

          $type_limit[0] = ceil($value $result_limit 100);
          $type_limit[1] = ceil($value $result_limit 100);
          $type_limit[2] = ceil($value $result_limit 100);

          $q "SELECT * FROM tbl 
                  UNION ALL SELECT * FROM tbl LIMIT 
          $type_limit[1]
                  UNION ALL SELECT * FROM tbl LIMIT 
          $type_limit[2]
                LIMIT 
          $result_limit"

          Kommentar

          Lädt...
          X