php
  • mysql
  • web
  • random
  • website
  • 2016-11-11 1 views 1 likes 
    1

    MYSQL 테이블에서 임의의 행을 가져올 PHP 스크립트를 작성하려고합니다. 지금까지 코드는 임의의 행을 성공적으로 가져 왔지만 때로는 아무 것도 반환하지 않으며 이유를 이해하지 못합니다.PHP 및 MYSQL - ORDER BY id가 아무 것도 반환하지 않음

    $result = $conn->query("SELECT fact 
             FROM numfacts 
             WHERE number = '".(string)$number."' 
              AND id >= (SELECT FLOOR(MAX(id) * RAND()) FROM numfacts) 
             ORDER BY id 
             LIMIT 1"); 
    

    $number 값은 현재 12이며,이 데이터베이스를 포함하는 두 개의 행이있다. 코드의 대략 2/3 배는 값을 반환하고 나머지 1/3은 0 개의 결과를 반환합니다.

    더 많은 코드가 필요하면 알려 드리겠습니다.

    +0

    'ORDER :

    당신이 가진 편견 선택을받을 수 있나요? – Cyclonecode

    답변

    0

    id >= (SELECT FLOOR(MAX(id) * RAND()) FROM numfacts)이있는 WHERE 절의 부분은 쿼리를 테이블의 하위 집합을 찾는 것으로 제한합니다. number = 12 인 두 행이이 하위 집합에 없으면 쿼리가 아무 것도 반환하지 않습니다. 그리고 부분 집합이 무작위로 지정되기 때문에, 이것은 시간의 일부만 발생합니다.

    하위 집합에 행 중 하나 이상이 number = 12으로 포함되도록하려면 해당 조건을 하위 쿼리에 포함 할 수 있습니다.

    SELECT fact 
    FROM numfacts 
    WHERE number = '".(string)$number."' 
        AND id >= (SELECT FLOOR(MAX(id) * RAND()) 
           FROM numfacts 
           WHERE number = '$number') 
    ORDER BY id 
    LIMIT 1 
    

    이 쿼리는 매우 적절한 행 선택을 제공하지 않습니다. ORDER BY id을 사용하기 때문에 낮은 번호의 행을 향해 편향됩니다. 이 방법은 다른 필터링없이 임의의 행을 선택하려는 경우에 적합하지만 number = 12 기준을 추가하면 불공정 해집니다. 예를 들어 두 행의 ID가 50과 75 인 경우 더 낮은 시간의 2/3을 선택합니다. 아이디 asc` 무엇 BY ID 내림차순 또는 ORDER BY

    SELECT fact 
    FROM numfacts 
    WHERE number = '$number' 
    ORDER BY RAND() 
    LIMIT 1 
    
    +0

    나는 좀 더 편향된 무작위로 얻을 수있는 다른 방법이 있습니까? – ashjack

    +0

    'SELECT ... ORDER BY RAND() LIMIT 1'을 사용하십시오. – Barmar

    0

    하위 쿼리 SELECT FLOOR(MAX(id) * RAND()) FROM numfacts$number보다 작은 값을 반환하면 전체 쿼리는 아무 것도 반환하지 않습니다.

    +0

    쿼리는 결코 그 난수를'$ number'와 비교하지 않습니다. – Barmar

    +0

    나쁘다, 조건에'number'와'id'가 있습니다. 당신의 대답은 훨씬 더 명확합니다. – Yaroslav

    관련 문제