2012-06-18 18 views
9

Rastgele seçilen bir tablodaki satırların% 50'sini güncellemek istiyorum. Bunu yapmanın bir yolu var mı?MySQL: Rastgele seçilen satırların% 50'sini nasıl güncellerim?

Düzenleme: Kayıtların% 50'sini her zaman güncelleştirmesi gerektiğini açıklığa kavuşturmak için, ancak bu% 50'lik satırların rasgele seçilmesi gerekir (örneğin yalnızca en üst% 50 değil). Diğer bir deyişle, ortalama olarak, diğer tüm kayıtlar güncellenmelidir.

cevap

22

böyle çalışması gerekir:

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

Evet, bunu test çalışır. Ama tabii ki, satırların sadece% 50'si değil, ortalama% 50'sidir.

SQL 92 tarifnamede yazılı olarak

, WHERE maddesi her demet için yürütülmelidir, yani rand() istenen sonucu elde yeniden değerlendirilmesi gerekir (bunun yerine tüm seçerek ya da hiç satır hiç ya). spesifikasyonu (vurgu madeni) den

Alıntı:

Genel kurallar

1) <search condition> T. sonucu <where clause> arasında her satır için tatbik edilir, bu satırların bir tablodur için <search condition> sonucunun doğru olduğu T değeri.

2) <search condition>her <subquery> etkili bir T her satır için yürütülen ve bir yürütülen, sonuçlar T. verilen satır <search condition> uygulanması kullanılan <subquery> bir bir dış başvuru içerir referans I bahsedilen olarak verilen satır T.

+1

Şüphesiz bu, * tüm * satırların yarısını güncelleyecektir ve diğer yarısı hiç olmazsa olmaz mı? – Widor

+2

Ve başka bir sorun var: planlandığı gibi çalışsa bile, herhangi bir satırı güncellemeyebilir veya tüm satırları güncelleyemez. RAND() rastgele, biliyorsun.) – raina77ow

+2

no, her bir tuple için nerede değerlendirme yapılır? – gexicide

6

bu sütunun değeri için T kolon, o zaman, bu pseudocode bir çeşit tarif, uzun bir yol var.)

$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

Bunu bir sorgu ile ifade edebilirsiniz. Daha sonra standart SQL kullanabilir ve garip pseudocode uzantıları kullanamazsınız. – gexicide

0

UPDATE tablo SET volumnvalue = X RAND() < = 0,5

0

RAND rastgele olmalıdır çok yakın kayıtların% 50 neden olur ve sağlam bir yüzdelik bölünmeyeceği .

Her X öğeyi bulmak için modüler operatör %'u kullanmak daha iyi olur. Bu, birincil Anahtar gibi benzersiz kimlik sütunlarıyla en iyi şekilde çalışır.6 SELECT * from <your_table_name> where <id_column_name> %6=0

bölünebilir her 6 satır, Seçme 2 SELECT * from <your_table_name> where <id_column_name> %2=0

bölünebilir

her 2. satır seçilmesi,:

tablo adı ve kimliği sütun adı belirtmek için emin olun, bu sorguyu çalıştırmayı deneyin

SELECT sonuçlarının iyi göründüğünden mutlu olduktan sonra, aynı WHERE yan tümcesi

kodunu kullanarak kayıtları güncelleştirmek için sözdizimi güncelleme sözdizimi ile sorguyu değiştirebilirsiniz.
İlgili konular