ORDER BY는 열을 여러 번 다시 계산하므로 ORDER BY 절에 RAND() 값이 있는 열을 사용할 수 없습니다. 그러나 MySQL3.23에서는 다음을 수행할 수 있습니다. SELECT * FROM table_name ORDER BY RAND()는 무작위성을 달성하기 위해 SELECT * FROM table1,table2 WHERE a=b AND c를 얻는 데 도움이 됩니다. 매뉴얼에서 다음을 찾았습니다. 작업을 완료하기 위한 설명:
SELECT * FROM table_name ORDER BY rand() LIMIT 5;
Rand는 매뉴얼에서 다음과 같이 말합니다::
랜드()
랜드(N)
0~1.0 범위의 임의 부동 소수점 값을 반환합니다. 정수 매개변수 N이 지정되면 초기값으로 사용됩니다.
mysql> RAND()를 선택;
-> 0.5925
mysql> RAND(20)을 선택;
-> 0.1811
mysql> RAND(20)을 선택;
-> 0.1811
mysql> RAND()를 선택;
-> 0.2079
mysql> RAND()를 선택;
-> 0.7888
ORDER BY는 열을 여러 번 다시 계산하므로 ORDER BY 절에 RAND() 값이 있는 열을 사용할 수 없습니다. 그러나 MySQL3.23에서는 다음을 수행할 수 있습니다. SELECT * FROM table_name ORDER BY RAND()는 SELECT * FROM table1,table2 WHERE a=b AND c를 얻는 데 도움이 됩니다.
WHERE 절의 RAND()는 WHERE가 실행될 때마다 다시 평가됩니다.
그런데 8,000개의 레코드가 있는 테이블의 경우 한 번 실행하는 데 0.08초가 걸리므로 다소 느립니다. 나중에 Google에 문의하여 다음 코드를 얻었습니다.
SELECT * FROM 테이블_이름 AS r1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM 테이블_이름)) AS id) AS r2 WHERE r1.id >= r2.id ORDER BY r1.id ASC LIMIT 5;
실행 효율성은 0.02초가 필요합니다. 불행하게도 mysql 4.1.* 이상에서만 이러한 하위 쿼리를 지원합니다.