2012-06-18 13 views
9

Ich möchte 50% der Zeilen in einer Tabelle nach dem Zufallsprinzip ausgewählt aktualisieren. Gibt es eine Möglichkeit, das zu tun?MySQL: Wie aktualisiere ich 50% der Zeilen, zufällig ausgewählt?

Edit: Nur um zu verdeutlichen, dass es immer 50% der Datensätze aktualisieren sollte, aber von diesen 50% müssen die Zeilen zufällig ausgewählt werden (nicht nur die oberen 50% zum Beispiel). Mit anderen Worten, jeder zweite Datensatz sollte im Durchschnitt aktualisiert werden.

Antwort

22

wie das funktionieren sollte:

UPDATE table SET x = y WHERE RAND() < 0.5 

Yep, es getestet, funktioniert. Aber natürlich sind es im Durchschnitt nur 50% der Reihen, nicht genau 50%.

Wie in der SQL 92-Spezifikation geschrieben, muss die WHERE-Klausel für jedes Tupel ausgeführt werden, sodass die rand() erneut ausgewertet werden muss, um das gewünschte Ergebnis zu erzielen (anstatt entweder alle oder keine Zeilen auszuwählen).

Auszug aus der Spezifikation (Hervorhebung von mir):

Allgemeinen Regeln

1) Die <search condition> an jede Zeile von T. Das Ergebnis der <where clause> angewandt wird, ist eine Tabelle dieser Reihen T für die das Ergebnis der <search condition> ist wahr.

2) jeweils in der <subquery><search condition>effektiv für jede Zeile von T ausgeführt wird und die Ergebnisse bei der Anwendung des <search condition> an die gegebene Reihe von T. verwendet wenn sie ausgeführt jede <subquery> enthält einen äußeren Bezug auf eine Spalte T, dann die Bezugnahme auf den Wert dieser Spalte in der bestimmten Reihe von T.

+1

Sicher würde das * alle * Zeilen die Hälfte der Zeit aktualisieren und keines für die andere Hälfte? – Widor

+2

Und noch ein Problem: Selbst wenn es wie geplant funktioniert, werden möglicherweise keine Zeilen aktualisiert - oder alle Zeilen aktualisiert. RAND() ist zufällig, weißt du?) – raina77ow

+2

nein, die where-Klausel wird für jedes Tupel ausgewertet. – gexicide

6

ist, wie gesagt, das ist ein langer Weg, in einer Art Pseudocode beschrieben.)

$x = SELECT COUNT(*) FROM some_table; 
@ids = SELECT id FROM some_table ORDER BY RAND() LIMIT $x/2; 
UPDATE some_table WHERE id IN (@ids); 
+1

Sie können das mit einer Abfrage ausdrücken. Dann können Sie Standard-SQL und ohne merkwürdige Pseudocode-Erweiterungen verwenden. – gexicide

0

UPDATE Tabelle SET volumnvalue = x RAND() < = 0,5 wird auf 50% der Datensätze in unmittelbarer Nähe zur Folge

0

RAND zufällig sein sollte und Sie werden nicht eine solide Perzentil Split bekommen .

Es wäre besser, den Modulo-Operator % zu verwenden, um jede X-Anzahl von Elementen zu finden. Dies funktioniert am besten mit eindeutigen ID-Spalten wie einem Primärschlüssel.

Diese Abfrage ausgeführt wird, sollten Sie Ihre Tabellennamen und ID Spaltennamen angeben:

jede zweite Zeile auswählen, teilbar durch 2 SELECT * from <your_table_name> where <id_column_name> %2=0

jede sechste Zeile auswählen, durch 6 teilbar SELECT * from <your_table_name> where <id_column_name> %6=0

Sobald Sie glücklich sind, dass die SELECT Ergebnisse gut aussehen, können Sie die Abfrage mit Update-Syntax ändern, um die Datensätze zu aktualisieren, mit der gleichen WHERE Klausel

Verwandte Themen