source

SQLite - RAND()로 주문

lovecheck 2023. 1. 15. 17:00
반응형

SQLite - RAND()로 주문

MySQL에서는 RAND() 함수를 사용할 수 있는데 SQLite 3에서는 대체 기능이 있나요?

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

random()사용합니다.

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

편집(QOP 기준): SQLite Autoincremented 열의 문서는 다음과 같이 기술되어 있습니다.

에서 설명한 일반 ROWID 선택 알고리즘에서는 최대 ROWID 값을 사용하지 않고 ROWID가 가장 큰 테이블 내의 엔트리를 삭제하지 않는 한 단조롭게 증가하는 고유 ROWID가 생성됩니다.행을 삭제할 경우 이전에 삭제된 행의 ROWID가 새 행을 작성할 때 재사용될 수 있습니다.

위의 내용은 고객님이 가지고 있지 않은 경우에만 해당됩니다.INTEGER PRIMARY KEY AUTOINCREMENTcolumn (계속 정상적으로 동작합니다)INTEGER PRIMARY KEY열)을 클릭합니다.어쨌든, 이것은 보다 휴대성/신뢰성이 높아집니다.

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

ROWID,_ROWID_그리고.OID는 SQLite 내부 행 ID의 모든 에일리어스입니다.

해결:

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

반응형