2012-06-18 26 views
9

Tôi muốn cập nhật 50% số hàng trong một bảng, được chọn ngẫu nhiên. Có cách nào để làm điều đó?MySQL: Làm cách nào để cập nhật 50% số hàng, được chọn ngẫu nhiên?

Chỉnh sửa: Chỉ cần làm rõ rằng nó sẽ luôn cập nhật 50% bản ghi, nhưng 50% số hàng đó phải được chọn ngẫu nhiên (không chỉ 50% trên cùng). Nói cách khác, trong avarage, mỗi bản ghi khác nên được cập nhật.

Trả lời

22

Nên hoạt động như thế:

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

Yep, thử nghiệm nó, hoạt động. Nhưng tất nhiên, chỉ 50% số hàng trung bình, không chính xác 50%.

Như được viết trong đặc tả SQL 92, mệnh đề WHERE phải được thực hiện cho mỗi bộ, do đó, rand() phải được đánh giá lại năng suất kết quả dự định (thay vì chọn tất cả hoặc không có hàng nào cả).

Trích từ các đặc điểm kỹ thuật (tôi nhấn mạnh):

Quy định chung

1) <search condition> được áp dụng cho mỗi hàng của T. Kết quả của <where clause> là một bảng của những dãy T cho số kết quả của số <search condition> là đúng.

2) Mỗi ​​<subquery> trong <search condition>được thực hiện một cách hiệu quả cho mỗi hàng của T và kết quả được sử dụng trong các ứng dụng của <search condition> vào hàng nhất định của T. Nếu bất kỳ thực hiện <subquery> chứa một tài liệu tham khảo bên ngoài để một cột của T, sau đó tham chiếu là giá trị của cột đó ở hàng nhất định T.

+1

Chắc chắn rằng sẽ cập nhật * tất cả * hàng một nửa thời gian và không có gì cả cho nửa còn lại? – Widor

+2

Và có một vấn đề khác: ngay cả khi nó hoạt động như kế hoạch, nó có thể không cập nhật bất kỳ hàng nào - hoặc cập nhật tất cả các hàng. RAND() là ngẫu nhiên, bạn biết đấy.) – raina77ow

+2

không, mệnh đề where được đánh giá cho mỗi tuple. – gexicide

6

Như tôi đã nói, đó là một chặng đường dài, được mô tả trong một loại giả.)

$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

Bạn có thể diễn đạt điều đó bằng một truy vấn. Sau đó, bạn có thể sử dụng SQL chuẩn và không có phần mở rộng giả mã lạ. – gexicide

0

CẬP NHẬT bảng SET volumnvalue = x ĐÂU RAND() < = 0,5 sẽ dẫn đến rất gần với 50% số hồ sơ

0

RAND nên ngẫu nhiên và bạn sẽ không nhận được một phần trăm phân chia rắn .

Sẽ tốt hơn nếu sử dụng toán tử mô đun % để tìm mọi số mục X. Điều này hoạt động tốt nhất với các cột id duy nhất như một Khóa chính.

Thử chạy truy vấn này, hãy chắc chắn để xác định tên bảng và tên cột id:

Lựa chọn mỗi hàng thứ 2, chia hết cho 2 SELECT * from <your_table_name> where <id_column_name> %2=0

Lựa chọn mỗi hàng 6, chia hết cho 6 SELECT * from <your_table_name> where <id_column_name> %6=0

Khi bạn hare vui rằng các kết quả SELECT có vẻ tốt, bạn có thể thay đổi truy vấn bằng cú pháp cập nhật để cập nhật các bản ghi, sử dụng cùng một mệnh đề WHERE