| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

13-01-2010, 10:38
|
|
teco2008
Registrierter Benutzer
|
|
Registriert seit: Jan 2010
Beiträge: 14
|
|
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
|

13-01-2010, 12:17
|
|
medium22
Registrierter Benutzer
|
|
Registriert seit: Mar 2006
Beiträge: 306
|
|
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
|

13-01-2010, 13:26
|
TobiaZ
 Moderator
|
|
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.188
|
|
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.
|

14-01-2010, 13:32
|
|
teco2008
Registrierter Benutzer
|
|
Registriert seit: Jan 2010
Beiträge: 14
|
|
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
|

14-01-2010, 14:03
|
TobiaZ
 Moderator
|
|
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.188
|
|
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.
|

14-01-2010, 17:02
|
|
Tarlar
Registrierter Benutzer
|
|
Registriert seit: Jul 2004
Beiträge: 262
|
|
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!
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|