2012-06-18 11 views
9

Quiero actualizar el 50% de las filas en una tabla, seleccionada al azar. ¿Hay alguna forma de hacer eso?MySQL: ¿Cómo actualizo el 50% de las filas, seleccionadas al azar?

Editar: Solo para aclarar que siempre debe actualizar el 50% de los registros, pero de esos 50% las filas deben seleccionarse al azar (no solo el 50% superior, por ejemplo). En otras palabras, en avarage, todos los demás registros deben actualizarse.

Respuesta

22

debería funcionar así:

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

Sí, probado, funciona. Pero, por supuesto, es solo el 50% de las filas en promedio, no exactamente el 50%.

Como está escrito en la especificación SQL 92, la cláusula WHERE debe ejecutarse para cada tupla, por lo que rand() debe reevaluarse produciendo el resultado deseado (en lugar de seleccionar todas o ninguna fila en absoluto).

Extracto de la especificación (énfasis mío):

Reglas Generales

1) El <search condition> se aplica a cada fila de T. El resultado de la <where clause> es una tabla de las filas de T para el cual el resultado de <search condition> es verdadero.

2) Cada <subquery> en el <search condition>se ejecuta efectivamente para cada fila de T y los resultados utilizados en la aplicación de la <search condition> a la fila dada de T. Si cualquier ejecutado <subquery> contiene una referencia externa a una columna de T, entonces la referencia es al valor de esa columna de la fila dada de T.

+1

Seguramente eso actualizaría * todas * las filas la mitad del tiempo y ninguna para la otra mitad? – Widor

+2

Y hay otro problema: incluso si funciona según lo planeado, es posible que no actualice ninguna fila ni actualice todas las filas. RAND() es aleatorio, ¿sabes?) – raina77ow

+2

no, la cláusula where se evalúa para cada tupla. – gexicide

6

Como dije, que es un largo camino, que se describe en una especie de pseudocódigo.)

$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

Puedes expresar eso con una consulta. Entonces puede usar SQL estándar y sin extrañas extensiones de pseudocódigo. – gexicide

0

actualización de la tabla SET volumnvalue = x DONDE RAND() < = 0,5 resultará en muy cerca de un 50% de los registros

0

RAND debe ser al azar y no obtendrá una fracción de percentil sólida .

Sería mejor utilizar el operador de módulo % para encontrar cada X cantidad de elementos. Esto funciona mejor con columnas únicas de id como una clave principal.

Intente ejecutar esta consulta, asegúrese de especificar el nombre de la tabla y el nombre de la columna id:

Selección de cada segunda fila, divisible por 2 SELECT * from <your_table_name> where <id_column_name> %2=0

Selección de cada fila 6, divisible por 6 SELECT * from <your_table_name> where <id_column_name> %6=0

Una vez que esté contento de que los resultados de SELECT se vean bien, puede cambiar la consulta con la sintaxis de actualización para actualizar los registros, usando la misma cláusula WHERE

Cuestiones relacionadas