2009-07-13 5 views
94

쿼리를 실행할 때마다 임의의 순서로 테이블 행을 반환하는 SQL 쿼리를 작성할 수 있습니까? 그것이 가장 효율적인 아니지만임의의 순서로 행을 반환

SELECT quote FROM quotes ORDER BY RAND() 

:

답변

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

MySQL의 경우'ORDER BY uuid()'를 사용하십시오. (... 나 같은 일반 검색을 통해이 페이지에 도착한 사람들에게!) –

+1

이것은 작동하지만, (14M + 행)에서 선택하는 테이블에서 광란하게 느립니다. 기대 되는가? AFAIK, 테이블의 색인이 제대로 생성되었습니다. –

+4

@ 존 - 1400 만 개의 레코드를 선택하고 고유 식별자로 생성하고 주문하는 중입니다. 아마 하나의 무작위 행 뒤에 있을까요? 이 경우 SELECT TOP 1 FROM table ORDER BY NEWID() –

18

이 가장 간단한 솔루션입니다. This one은 더 나은 솔루션입니다.

+10

작동하지 않는 예쁜 확인합니다. ORDER BY 절의 RAND()는 한 번만 계산되므로 자연스러운 순서로 끝납니다. 그것을 테스트하려면 ORDER BY RAND(), 1을 시도하면 첫 번째 열 (적어도 SQL Server 2005 이상)에서 orderd의 목록을 얻을 수 있습니다. –

+0

흠, 나는 이것이 과거에 나를 위해 일했다고 확신합니다. 아마 당신이 사용하는 제품에 달려있을 것입니다. –

+0

그것은 MS SQL에서 작동하지 않는 것 같습니다. –

11

일반적인 방법은 고유 한 GUID를 생성하는 NEWID() 함수를 사용하는 것입니다. 따라서

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

명백한 선택 인 RAND() 함수는 직접 작동하지 않지만 다음과 같은 임시 해결 방법이 있습니다. http://weblogs.sqlteam.com/jeffs/archive/2004/11/22/2927.aspx – devstuff

+0

+1, 하지만 Dave Barker는 더 빨랐습니다 :) –

0

효율적이고 무작위 적으로 두 가지 다른 쿼리를 사용하는 것이 가장 좋습니다.

뭔가 같은 ... 테이블

그때부터

SELECT에서 table_id는 선택한 언어로, 다음, 임의의 ID를 선택 해당 행의 데이터를 당깁니다. 테이블에서

SELECT * WHERE 내 table_id = $ rand_id

하지만 그건 정말 당신이 테이블의 행을 많이 가지고 기대하는 경우 좋은 생각이 아니다. 무작위로 선택하는 것에 제한을 두는 것이 좋습니다. 간행물의 경우 작년 내에 게시 된 항목 만 무작위로 선택할 수 있습니다.

1

여기에 예 (source)입니다 :

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

이 필요한 것입니다 :

SELECT *를 TABLE_NAME 순서와 RAND에 의해() LIMIT 1

+3

질문에 SQL Server 태그가 지정되었습니다. RAND()가 작동하지 않고 LIMIT가 인식되지 않으며 결과가 하나의 레코드로 제한되도록 요청하지 않습니다. – LarsTech

관련 문제