IT박스

SQLite-ORDER BY RAND ()

itboxs 2020. 11. 19. 07:59
반응형

SQLite-ORDER BY RAND ()


MySQL에서는 RAND () 함수를 사용할 수 있습니다. SQLite 3에 대안이 있습니까?


사용 ) (랜덤 :

SELECT foo FROM bar
  WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
  LIMIT 1;

EDIT (by QOP) : SQLite Autoincrement ed 열의 문서 는 다음과 같이 설명합니다.

위에서 설명한 일반 ROWID 선택 알고리즘 은 최대 ROWID 값을 사용하지 않고 가장 큰 ROWID를 가진 테이블의 항목을 삭제하지 않는 한 단조 증가하는 고유 ROWID생성 합니다. 행을 삭제 한 경우 새 행을 만들 때 이전에 삭제 된 행의 ROWID가 재사용 될 수 있습니다 .

위의 내용은 INTEGER PRIMARY KEY AUTOINCREMENT이없는 경우에만 해당 됩니다 (열에서도 잘 작동합니다 INTEGER PRIMARY KEY). 어쨌든 이것은 더 이식 가능하고 신뢰할 수 있어야합니다.

SELECT foo FROM bar
  WHERE _ROWID_ >= (abs(random()) % (SELECT max(_ROWID_) FROM bar))
LIMIT 1;

ROWID, _ROWID_그리고 OIDSQLite 내부 행 ID의 모든 별칭입니다.


SELECT * FROM table ORDER BY RANDOM() LIMIT 1;

해결됨 :

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;

훨씬 더 나은 성능을 위해 SQLite에서 다음을 사용하십시오.

SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x) 

이것은 MySQL에도 적용됩니다. 이것은 SQL 엔진이 먼저 투영 된 행 필드를 메모리에로드 한 다음 정렬 하기 때문에 더 빠르게 실행됩니다 . 여기서는 행의 id 필드를로드하고 무작위로 정렬 한 다음 X를 가져 와서 다음과 같은 X ID의 전체 행을 찾습니다. 기본 색인.

참고 URL : https://stackoverflow.com/questions/1253561/sqlite-order-by-rand

반응형