복붙노트

[SQL] MySQL은 : 기록의 양의 비율에 의한 LIMIT?

SQL

MySQL은 : 기록의 양의 비율에 의한 LIMIT?

하자 내가이 같은 값의 목록을 가지고 말 :

id  value
----------
A   53
B   23
C   12
D   72
E   21
F   16
..

나는이 목록의 상위 10 %가 필요합니다 - 나는 시도했다 :

  SELECT id, value 
    FROM list
ORDER BY value DESC
   LIMIT COUNT(*) / 10

하지만이 작동하지 않습니다. 문제는 내가 쿼리를 수행하기 전에 레코드의 양을 알 수 없다는 것입니다. 어떤 생각인가?

해결법

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

    1.우수 답변의 내가 발견

    우수 답변의 내가 발견

    SELECT*
    FROM    (
        SELECT list.*, @counter := @counter +1 AS counter
        FROM (select @counter:=0) AS initvar, list
        ORDER BY value DESC   
    ) AS X
    where counter <= (10/100 * @counter);
    ORDER BY value DESC
    

    다른 비율을 얻기 위해 열을 변경합니다.

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

    2.당신은 순서가, 또는 임의의 상황이 일을하는 경우 - 나는 다음과 같은 스타일을 사용하기 시작했습니다 :

    당신은 순서가, 또는 임의의 상황이 일을하는 경우 - 나는 다음과 같은 스타일을 사용하기 시작했습니다 :

    SELECT id, value FROM list HAVING RAND() > 0.9
    

    당신이 그것을 필요로하는 경우에 무작위하지만 씨앗 (PHP와 예)를 사용할 수 있습니다 제어합니다 :

    SELECT id, value FROM list HAVING RAND($seed) > 0.9
    

    마지막으로 -이 것은 일종의 당신이 실제로 행이 삽입 될 때마다 임의의 값을 유지하는 열을 추가 할 수 있습니다를 완벽하게 제어 할 필요가 다음 쿼리 것을 사용하는 것입니다 경우

    SELECT id, value FROM list HAVING `rand_column` BETWEEN 0.8 AND 0.9
    

    이 정렬 또는 ORDER BY 필요하지 않기 때문에 - 오히려 O에 비해 O (N) (N LG 전자 N)입니다

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

    3.또한 그와 함께 시도 할 수 있습니다 :

    또한 그와 함께 시도 할 수 있습니다 :

    SET @amount =(SELECT COUNT(*) FROM page) /10;
    PREPARE STMT FROM 'SELECT * FROM page LIMIT ?';
    EXECUTE STMT USING @amount;
    

    이 여기에 설명 된 MySQL의 버그 : http://bugs.mysql.com/bug.php?id=19795

    이 도움이됩니다 바랍니다.

  4. ==============================

    4.나는 다른 답변에서 했나요되지 않은 대안이 : 당신은 모든 언어에서 액세스 할 경우 MySQL의 API (즉되지는 MySQL CLI)에 대한 전체 액세스 권한이 경우, 당신은 얼마나 많은 행이 것이다 요청 쿼리를 실행할 수 있습니다 하고이 시간이면 루프를 중단.

    나는 다른 답변에서 했나요되지 않은 대안이 : 당신은 모든 언어에서 액세스 할 경우 MySQL의 API (즉되지는 MySQL CLI)에 대한 전체 액세스 권한이 경우, 당신은 얼마나 많은 행이 것이다 요청 쿼리를 실행할 수 있습니다 하고이 시간이면 루프를 중단.

    EG YN 비돈 :

    ...
    maxnum = cursor.execute(query)
    for num, row in enumerate(query)
        if num > .1 * maxnum: # Here I break the loop if I got 10% of the rows.
            break
        do_stuff...
    

    후자는 항상 필요한 모든 행을 받아 들일 것을 요구 이것은하지 mysql_use_result ()와 함께) mysql_store_result가 (에서만 작동합니다.

    OTOH, 내 솔루션에 대한 트래픽이 너무 높을 수 있습니다 - 모든 행을 전달해야합니다.

  5. from https://stackoverflow.com/questions/5615172/mysql-limit-by-a-percentage-of-the-amount-of-records by cc-by-sa and MIT license