복붙노트

[SQL] SQLite는 무작위 행 (들)을 선택

SQL

SQLite는 무작위 행 (들)을 선택

MySQL의에서 다음과 같은 성명 X 임의의 행을 선택할 수 있습니다 :

SELECT * FROM table ORDER BY RAND() LIMIT X

이 SQLite는에서가 아니라,하지만 작업을 수행합니다. 동등한이 있습니까?

해결법

  1. ==============================

    1.훨씬 더 나은 성능을 사용하기 위해 :

    훨씬 더 나은 성능을 사용하기 위해 :

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

    SQL 엔진은 첫 번째로드는 일종의 그들, 우리가 그냥 색인 있기 때문에, 메모리에의 후 별도의 X 각 행의 id 필드에 임의의 일종을,이 X ID를 사용하여 전체 행을 발견 한 후 메모리에 행 필드를 예상 .

    이 덜 RAM과 CPU를 소비 그래서 표는 성장함에 따라!

  2. ==============================

    2.RANDOM () LIMIT X BY 테이블 ORDER SELECT * FROM

    RANDOM () LIMIT X BY 테이블 ORDER SELECT * FROM

  3. ==============================

    3.

    SELECT * FROM table ORDER BY RANDOM() LIMIT 1
    
  4. ==============================

    4.여기에 모든 답은 ORDER BY를 기반으로합니다. 각 레코드에 대한 RANDOM () 및 리소스 비용이 많이 드는 작업이다 다음 ORDER BY를 평가하기 때문에이 대형 세트 (즉, 사용할 수없는) 매우 비효율적이다.

    여기에 모든 답은 ORDER BY를 기반으로합니다. 각 레코드에 대한 RANDOM () 및 리소스 비용이 많이 드는 작업이다 다음 ORDER BY를 평가하기 때문에이 대형 세트 (즉, 사용할 수없는) 매우 비효율적이다.

    타 방법은 절 예를 들어,이 경우 얻을 수있는 0.5 히트 기회의 장소 복근 (CAST (랜덤 () AS REAL)) / 9223372036854775808 <0.5이다.

    SELECT *
    FROM table
    WHERE abs(CAST(random() AS REAL))/9223372036854775808 < 0.5
    

    다수 랜덤 () 생성 할 수있는 최대 절대 값이다. 가 서명되기 때문에 복근은 ()이다. 결과는 0과 1 사이에서 균일하게 분포 된 랜덤 변수이다.

    이것은 단점이있다. 당신은 결과를 보장 할 수 없습니다 및 임계 값이 테이블에 비해 큰 경우, 선택한 데이터 테이블의 시작을 향한 왜곡 될 것입니다. 그러나 몇 가지주의 깊게 설계 상황에서, 그것은 실현 가능한 옵션이 될 수 있습니다.

  5. ==============================

    5.이 사람은 부정적인 RANDOM 정수를 해결하고, 대규모 데이터 세트에 좋은 성능을 유지한다 :

    이 사람은 부정적인 RANDOM 정수를 해결하고, 대규모 데이터 세트에 좋은 성능을 유지한다 :

    SELECT * FROM table LIMIT 1 OFFSET abs(random() % (select count(*) from table));
    

    어디: 복근 (랜덤 () %의 n)은 (N, 0) 당신에게 범위의 양의 정수를 제공합니다

  6. from https://stackoverflow.com/questions/4114940/select-random-rows-in-sqlite by cc-by-sa and MIT license