2011-06-30 20 views
5

Widziałem wiele tematów na ten temat i nie udało mi się zrozumieć, jak to zrobić.Wybieranie losowych wierszy z MySQL

Na przykład, jeśli mam poniższej tabeli:

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

i chcę pokazać tylko losowe X wiersze z klasy "jeden", w jaki sposób można to zrobić?

uwaga: jest to duży stół, więc nie chcę używać ZAMÓWIENIA PRZEZ RAND.

+0

możliwe duplikat [szybkiego wyboru losowego rzędu z dużym stołem w mysql] (http://stackoverflow.com/questions/211329/quick-selection-ofa-a-andom-row-from-a-large-table-in-mysql) – outis

Odpowiedz

20

Rozwiązanie, które większość ludzi zaleca, nie skaluje do dużych stołów, jak już wiesz.

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; 

Omówię to i inne rozwiązania w mojej książce, SQL Antipatterns: Avoiding the Pitfalls of Database Programming.


Jeśli chcesz to zrobić z PHP, można zrobić coś takiego (nie sprawdzone)

<?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

Wow, to jest wysoki poziom SQL. Jest to możliwe w PHP? i jego pełny kod, który muszę napisać na mysqli_query()? – Daniel

+0

Czy mogę mieć proste? – Daniel

+0

Zaktualizowałem powyższy przykład do PHP. Ale to nie jest testowane. –

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

Uwaga: Używam dużego stołu i ORDER BY RAND () bom wszystkie wiersze w tabeli i jest bardzo powoli. – Daniel

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

zamawianie przez rand() nie jest szczególnie skuteczny, ale to o najmniejszej/najszybszy sposób to zrobić.

+0

Uwaga: Używam dużego stołu i ORDER BY RAND() bom wszystkie wiersze w tabeli i to bardzo wolno. – Daniel

+0

Tak, ale sortowałoby tylko wiersze, w których klasa to "jeden", a nie cała tabela. –

+0

klasa "jeden" może zawierać tysiące wierszy. Nawiasem mówiąc, czy mogę uzyskać twój komunikator i skype? – Daniel

Powiązane problemy