2012-06-18 7 views
9

Chcę zaktualizować 50% wierszy w tabeli, losowo wybranych. Czy istnieje jakiś sposób, aby to zrobić?MySQL: Jak zaktualizować 50% wierszy, losowo wybranych?

Edytuj: Tylko po to, aby wyjaśnić, że powinna zawsze aktualizować 50% rekordów, ale z tych 50% wiersze muszą być losowo wybrane (nie tylko górne 50% na przykład). Innymi słowy, w miarę upływu czasu każdy inny rekord powinien być aktualizowany.

Odpowiedz

22

Powinna działać tak:

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

Tak, przetestowane, działa. Ale oczywiście to tylko 50% wierszy średnio, a nie dokładnie 50%.

Zgodnie ze specyfikacją SQL 92, dla każdej krotki musi być wykonana klauzula WHERE, więc rand() musi zostać ponownie oceniony, aby uzyskać zamierzony wynik (zamiast wybierać w ogóle wszystkie wiersze lub nie).

Fragment Specification (kopalni nacisk)

Ogólne zasady

1) <search condition> jest stosowana do każdego wiersza T. wyniku z <where clause> tabelę tych rzędów T dla którego wynik <search condition> jest prawdziwy.

2) każdy <subquery> w <search condition>jest efektywnie wykonywane w każdym rzędzie T się i wyniki stosuje do stosowania z <search condition> w danym rzędzie T. Jeżeli każdy wykonany <subquery> zawiera zewnętrzną odniesienie do kolumna T, a następnie odniesienia jest wartość w kolumnie w danym rzędzie T.

+1

Z pewnością to zaktualizowałoby * wszystkie * wiersze o połowę krótsze, a żadne inne dla drugiej połowy? – Widor

+2

I jest jeszcze jeden problem: nawet jeśli działa zgodnie z planem, może nie aktualizować żadnych wierszy - lub zaktualizować wszystkie wiersze. RAND() jest losowy, wiesz.) – raina77ow

+2

nie, klauzula where jest oceniana dla każdej krotki. – gexicide

6

Jak powiedzieć, że długa sposób opisany w rodzaju Pseudokod.)

$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

Możesz wyrazić to jednym zapytaniem. Następnie możesz użyć standardowego SQL i bez dziwnych rozszerzeń pseudokodowych. – gexicide

0

UPDATE tabela SET volumnvalue = x gdzie RAND() < = 0,5 spowoduje bardzo blisko 50% zapisów

0

RAND powinien być losowy i nie dostaniesz solidną percentyla rozłam .

Byłoby lepiej użyć operatora modulusa %, aby znaleźć wszystkie X liczby pozycji. Działa to najlepiej w przypadku unikalnych kolumn identyfikacyjnych, takich jak klucz podstawowy.

Spróbuj uruchomić tej kwerendy, należy określić nazwę tabeli i nazwę kolumny ID:

Wybór co 2 wiersz, podzielna przez 2 SELECT * from <your_table_name> where <id_column_name> %2=0

Wybór każdego 6th wiersz, podzielna przez 6 SELECT * from <your_table_name> where <id_column_name> %6=0

Po uzyskaniu satysfakcji, że wyniki SELECT wyglądają dobrze, można zmienić zapytanie za pomocą składni aktualizacji, aby zaktualizować rekordy, używając tego samego klauzuli