2011-06-30 19 views
5

Vi muchos temas sobre este tema y no he tenido éxito en la comprensión de cómo hacerlo.Selección de filas aleatorias con MySQL

Por ejemplo, si tengo esta tabla:

+------+-------+-------+ 
| id | name | class | 
+------+-------+-------+ 
| 5 | test | one | 
| 10 | test2 | one | 
| 12 | test5 | one | 
| 7 | test6 | two | 
+------+-------+-------+ 

y quiero mostrar al azar sólo las filas de la clase X "uno", ¿cómo puedo hacer eso?

nota: es una gran tabla, por lo que no quiero usar ORDER BY RAND.

+0

posible duplicado de [la selección de una fila al azar de una gran mesa en mysql] (http://stackoverflow.com/questions/211329/quick-selection-of-a-random-row-from-a-large-table-in-mysql) – outis

Respuesta

20

La solución ORDER BY RAND() que la mayoría de la gente recomienda no escala a tablas grandes, como ya sabrá.

SET @r := (SELECT FLOOR(RAND() * (SELECT COUNT(*) FROM mytable))); 
SET @sql := CONCAT('SELECT * FROM mytable LIMIT 1 OFFSET ', @r); 
PREPARE stmt1 FROM @sql; 
EXECUTE stmt1; 

que cubren esta y otras soluciones en mi libro, SQL Antipatterns: Avoiding the Pitfalls of Database Programming.


Si usted quiere hacer esto con PHP, usted podría hacer algo como esto (no probado):

<?php 
$mysqli->begin_transaction(); 
$result = $mysqli->query("SELECT COUNT(*) FROM mytable") 
$row = $result->fetch_row(); 
$count = $row[0]; 
$offset = mt_rand(0, $count); 
$result = $mysqli->query("SELECT * FROM mytable LIMIT 1 OFFSET $offset"); 
... 
$mysqli->commit(); 
+0

Guau, este es un alto nivel de SQL. Esto es posible en PHP? y es el código completo que necesito escribir en mysqli_query()? – Daniel

+0

¿Puedo tener opciones simples? – Daniel

+0

He actualizado el ejemplo anterior a PHP. Pero no está probado. –

0
SELECT * FROM `table` WHERE `class`="one" ORDER BY RAND() LIMIT 5 
+0

Aviso: uso big table, y ORDER BY RAND () desde todas las filas en la tabla y es muy lento. – Daniel

2
select ID, NAME, CLASS 
from YOURTABLE 
where CLASS='one' 
order by rand() 
limit $x 

pedido por rand() no es particularmente eficiente, pero se trata de la forma más pequeña/más rápida de hacerlo.

+0

Aviso: uso big table, y ORDER BY RAND() ORDER BY RAND() desde todas las filas de la tabla y es muy lento. – Daniel

+0

Sí, pero solo estaría ordenando las filas donde la clase es 'uno', no la tabla completa. –

+0

la clase "uno" puede incluir miles de filas. Por cierto, ¿puedo obtener su mensajero y Skype? – Daniel

Cuestiones relacionadas