2009-07-13 22 views

Respuesta

153
SELECT * FROM table 
ORDER BY NEWID() 
+43

Para MySQL use' ORDER BY uuid() '. (... para los que llegan a esta página a través de una búsqueda genérica, como yo!) –

+1

Esto funciona, pero es terriblemente lento en la tabla que estoy seleccionando (14M + filas). ¿Es eso esperado? AFAIK, la tabla está indexada correctamente. –

+4

@John: está seleccionando 14 millones de registros y generando y ordenando mediante un identificador único. Tal vez eres solo después de una sola fila al azar? En este caso, SELECCIONE la tabla TOP 1 FROM ORDER BY NEWID() –

18

Esta es la solución más simple:

SELECT quote FROM quotes ORDER BY RAND() 

Aunque no es el más eficiente. This one es una mejor solución.

+10

Bastante seguro de que no funciona. El RAND() en la cláusula ORDER BY solo se calcula una vez, por lo que terminas con un orden natural. Para probarlo, pruebe ORDER BY RAND(), 1 y obtendrá una lista de sus cotizaciones ordenadas por la primera columna (al menos en SQL Server 2005). –

+0

Hm, estoy bastante seguro de que esto ha funcionado para mí en el pasado, tal vez depende del producto que utilice. –

+0

Parece que no funciona en MS SQL. –

11

El método habitual es utilizar la función NEWID(), que genera un GUID único. Por lo tanto,

SELECT * FROM dbo.Foo ORDER BY NEWID(); 
+0

La opción obvia, la función RAND() no funciona directamente, pero aquí hay una solución alternativa: http://weblogs.sqlteam.com/jeffs/archive/2004/11/22/2927.aspx – devstuff

+0

+1 funciona, pero Dave Barker fue más rápido :) –

0

Para ser eficiente y aleatorio, podría ser mejor tener dos consultas diferentes.

Algo así como ...

identificador de tabla SELECT FROM tabla

Luego, en el idioma seleccionado, elija un ID aleatorio, a continuación, tire de los datos de esa fila.

SELECT * FROM tabla WHERE table_id = $ rand_id

Pero eso no es realmente una buena idea si usted está esperando a tener un montón de filas de la tabla. Sería mejor si pone algún tipo de límite en lo que selecciona al azar. Para publicaciones, quizás elija al azar solo artículos publicados en el último año.

1

He aquí un ejemplo (source):

SET @randomId = Cast(((@maxValue + 1) - @minValue) * Rand() + @minValue AS tinyint); 
-1

Esto es lo que necesita:

SELECT * FROM ORDEN nombre_tabla POR RAND() LIMIT 1

+3

La pregunta fue etiquetada SQL Server. El RAND() no funciona y el LÍMITE no se reconoce, ni la pregunta pide limitar los resultados a un registro. – LarsTech

Cuestiones relacionadas