registros - select random mysql
Seleccionar filas al azar con MySQL (3)
Vi muchos temas sobre este tema y no he podido comprender cómo hacerlo.
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 solo X filas de la clase "uno", ¿cómo puedo hacer eso?
nota: su gran mesa, así que no quiero usar ORDER BY RAND.
SELECT * FROM `table` WHERE `class`="one" ORDER BY RAND() LIMIT 5
select ID, NAME, CLASS
from YOURTABLE
where CLASS=''one''
order by rand()
limit $x
ordenar por rand()
no es particularmente eficiente, pero se trata de la forma más pequeña / más rápida de hacerlo.
La solución ORDER BY RAND()
que la mayoría de la gente recomienda no escala a tablas grandes, como ya sabe.
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;
Abordo esta y otras soluciones en mi libro, SQL Antipatterns: Cómo evitar las trampas de la programación de bases de datos .
Si quieres hacer esto con PHP, podrías 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();