Randomisierte Zuteilung von Benutzerinformationen

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

  • Randomisierte Zuteilung von Benutzerinformationen

    Hallo zusammen,
    ich habe ein PHP/MySQL Problem, was ich versuchen möchte, mit euch konzeptionell zu klären:

    Problem a):
    Ich habe in einer MySQL Tabelle "Benutzer" eine bestimmte Benutzeranzahl X mit einer eindeutig zugewiesenen group_id.
    Für diese spezifische Gruppe von Nutzern möchte ich eine *gleichmäßige* und gleichzeitig *zufällige* Verteilung von einer weiteren Zuordnung (Team A oder Team B) realisieren.
    Dazu befindet sich in der selben Benutzertabelle eine Spalte mit dem Wert "team" - VARCHAR(1).
    Hier meine Vorstellung ohne direkte programmiertechnische Umsetzung:
    mit einem SELECT unter der Bedingung dass nur Benutzer der Gruppe X gewählt werden, selektiere ich die Benutzer, die eingeteilt werden sollen.
    Das Resultat lade ich ein Array, welches durch zwei (?) geteilt wird (was falls ungerade?). Der eine Teil bekommt A zugewiesen, der andere Teil B - das ganze dann via UPDATE zurück in die Benutzertabelle.

    Problem b):
    eine zweite Funktion soll die Team Information bereits zugeteilter Nutzer invertieren - also alle Nutzer mit group_id x die vorher A waren, sollen nun als B abgespeichert werden. Hier einfach zwei SELECTs und UPDATEs die jeweils unter der Bedingung group_id = X AND team = A|B agieren, oder geht es eleganter?

    Leider bin ich mit Schleifen unter solchen Konditionen sehr wenig bewandert und würde mich sehr über einige Denkanstöße des Forums freuen!

    Viele Grüße,
    teco_2008

  • #2
    Hallo,


    Ich würde da Problem b vor Problem a abarbeiten. Als erstes einfach alle Benutzer auslesen die bereits einem Team angehören und diese dann innerhalb der Schleife (in diesem Fall vermutlich while) updaten.
    Im nächsten Schritt dann Problem a angehen und alle Benutzer auslesen die keine Teamzugehörigkeit haben. Auf diese Abfrage dann als erstes ein mysql_num_rows jagen um zu erfahren wieviele es sind - falls es, wie Du schon richtig erkannt hast, eine ungerade Anzahl ist. Dann prüfen ob diese Anzahl gerade ist, wenn ja durch zwei teilen und wenn nein -1 und dann teilen. Danach kannst Du mit einem Zähler (der auf der obigen teilung basiert) das ganze updaten.

    Gruss

    Kommentar


    • #3
      Wann das invertieren (b) stattfindet ist ja relativ egal. Bzw. ergibt sich aus der Aufgabenstellung. Programmtechnisch ist das aber wirklich nicht mehr als UPDATE.

      Bezüglich (a) würde ich einfach mal zusehen, wie gut ORDER BY RAND() dir deinen Zufall liefert. Wenn dir das reicht, dann einfach zufällig sortieren und die Hälfte auswählen und Updaten. Der Rest (ohne Wert) bekommt dann das andere Team. Alternativ kannst du natürlich auch alle Auslesen, PHP spielt den Zufall und dann das Update fahren.

      Prinzipiell nicht so kompliziert.

      Worauf kommt es dir wirklich an? Ich glaube das konzeptionelle ist noch eher dein Problem. Denn wenn das sicher steht, ist auch die Umsetzung kein Problem. Und wie oft wird diese Routine durchgeführt?

      Ich vermute, wenn man den Hintergrund besser versteht, dann ists einfacher die nen konkreten Vorschlag zur Ideallösung zu nennen.

      Kommentar


      • #4
        Hallo zusammen,
        danke für die Antworten.
        @medium22: b) vor a) zu bearbeiten ist nicht möglich, da die Benutzer ohne Team Zuordnung in der Tabelle stehen / geschrieben werden.
        @Tobiaz: kannst du näher beschreiben wie die Randomisierung direkt im Update via ORDER_BY_RAND() funktioniert? Die Routine wird nur durch Benutzerinteraktion ausgeführt. Alle drei Monate. Es geht um eine Semesterverwaltung in meiner Uni und genauer gesagt bei dieser Sache um die Zuordnung eines Semesters (group_id) zu Teams A und B. Gerecht (Zufall) und am Semesterende invertiert (Invertierung, Problem b)).
        Viele Grüße,
        teco_2008

        Kommentar


        • #5
          Ganz ehrlich, ich würde vorschlagen du guckst lieber selbst erstmal ins Manual und zeigst deine Versuche, falls es nicht sogar auf Anhieb klappen sollte. Das haben wir hier schon immer so gehandhabt.

          Kommentar


          • #6
            Die Invertierung ist nicht wirklich schwer. Da bedient man sich einfach der Modulo-Funktion.

            Ich hab es selber noch nicht verwendet, aber prinzipiell müsste das so funktionieren:

            PHP-Code:
            "UPDATE benutzer SET team = MOD(team + 1, anzahl_gruppen) WHERE group_id = 'x' 
            Bei nur 2 Teams ändert sich die Zahl des Teams immer von 0 nach 1.
            Bei mehreren Teams wird einfach jeder ein Team weitergeschoben!

            Kommentar

            Lädt...
            X