복붙노트

[SQL] 잠시 / 루프를 수행하면 10 개 임의 결과를 얻을 수 있습니다

SQL

잠시 / 루프를 수행하면 10 개 임의 결과를 얻을 수 있습니다

안녕하세요 나는 10 개 개의 서로 다른 태그 내 웹 사이트에 게재됩니다 검색 엔진 내 웹 사이트에 올 때마다 나의 웹 사이트에 대한 태그 스크립트를 만들기 위해 노력하고있어.

이 태그는 DB에서 잡고됩니다. 그것은 단지 하나 잡고 있도록 그래서 순간에 나는 그것을 코딩했다. (내가 아는하지 않기 때문에 잠시 작업을 수행하는 방법)

같은

$sql = "SELECT tagname FROM tags ORDER BY rand() LIMIT 10";
$result = mysql_query($sql);
$row = mysql_fetch_object($result);
echo "<a href='index.php'>" .$row->tagname. " </a>";

나는 그에게 그것을 않도록 10 시간 동안을 추가 할 수 있습니다 어쨌든 있나요? 예컨대 같은 에코를 사용하는 대신 1의 10 개 개의 결과를 출력 .... 난 10 일에서 한계를 변경했지만 여전히 하나를 보여주는 ...없는 일을 행한 ...

해결법

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

    1.참고, 진짜 대답하기 전에 반드시 읽어 :이 답변을 downvoting 계속 사람을 위해. 그리고 마지막 부분, 질문 ( "동안을하는"로 시작하는이 있음) 제목 읽기 ( "거기 어쨌든 나는 동안 그에게 그것을 않도록 10 번를 추가 할 수 있습니까?"). 이 답변하지 않는 RAND 함수의 사용에 대한 결과 집합을 반복 관한 것입니다! 쿼리도 내 대답에 표시되지 않으며, 또한 마지막에 다른 접근 방식을 제안하고있다 :

    참고, 진짜 대답하기 전에 반드시 읽어 :이 답변을 downvoting 계속 사람을 위해. 그리고 마지막 부분, 질문 ( "동안을하는"로 시작하는이 있음) 제목 읽기 ( "거기 어쨌든 나는 동안 그에게 그것을 않도록 10 번를 추가 할 수 있습니까?"). 이 답변하지 않는 RAND 함수의 사용에 대한 결과 집합을 반복 관한 것입니다! 쿼리도 내 대답에 표시되지 않으며, 또한 마지막에 다른 접근 방식을 제안하고있다 :

    당신은 루프에서 mysql_fetch_object에 전화를 포장 할 필요가

    $result = mysql_query($sql);
    
    while ($row = mysql_fetch_object($result))
    {
    echo "<a href='index.php'>" .$row->tagname. " </a>";
    }
    

    나중에 편집 기타 고려 사항은 다음과 같습니다

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

    2.() ORDER BY RAND 사용을 중지하십시오. 그냥 멈춰. 이 작업은 "복잡성 N *은 log2 (N), 쿼리에 소요되는 시간이 성장할 것을 의미있다

    () ORDER BY RAND 사용을 중지하십시오. 그냥 멈춰. 이 작업은 "복잡성 N *은 log2 (N), 쿼리에 소요되는 시간이 성장할 것을 의미있다

        entries  |  time units
      -------------------------
             10  |         1     /* if this takes 0.001s */
          1'000  |       300
      1'000'000  |   600'000     /* then this will need 10 minutes */
    

    당신이 무작위 결과를 생성 할 경우에, 그 (것)들을 생성하는 저장 프로 시저를 만듭니다. 이 (당신이 읽어야이 기사에서 가져온 코드)와 같은 뭔가 :

    DELIMITER $$
    DROP PROCEDURE IF EXISTS get_rands$$
    CREATE PROCEDURE get_rands(IN cnt INT)
    BEGIN
      DROP TEMPORARY TABLE IF EXISTS rands;
      CREATE TEMPORARY TABLE rands ( tagname VARCHAR(63) );
    
    loop_me: LOOP
        IF cnt < 1 THEN
          LEAVE loop_me;
        END IF;
    
        SET cnt = cnt - 1;
    
        INSERT INTO rands
           SELECT tags.tagname
             FROM tags 
             JOIN (SELECT (RAND()*(SELECT MAX(tags.id) FROM tags)) AS id) AS choices
            WHERE tags.id >= choices.id
            LIMIT 1;
    
      END LOOP loop_me;
    END$$
    DELIMITER ;
    

    그리고 그것을 사용하는, 당신은 작성합니다 :

    CALL get_rands(10);
    SELECT * FROM rands;
    

    PHP 측에서 모두 실행에 관해서는, 당신은 고대 mysql_로의 * API를 사용 중지해야합니다. 그것은 10 년 이상 오래되고 더 이상 유지한다. 지역 사회도 그들을 비하하기위한 과정을 시작했다. 대신 당신은 PDO 또는 MySQLi를 사용한다 2012 년 mysql_로 * 작성 더 이상 새로운 코드가 없어야합니다. (PDO와 함께)를 작성하는 방법에 관해서는 :

    // creates DB connection
    $connection = new PDO('mysql:host=localhost;dbname=mydb;charset=UTF-8', 
                          'username', 'password');
    $connection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    
    // executes the procedure and creates select statement
    $connection->exec('CALL get_rands(10)');
    $statement = $connection->query('SELECT * FROM rands');
    
    // performs query and collects all the info
    if ($statement->execute())
    {
        $tags = $statement->fetchAll(PDO::FETCH::ASSOC);
    }
    

    요구 사항뿐만 아니라 10 임의 결과, 실제로는 10 UNIQUE 임의 결과를 얻을 수 있다면, 그것은 절차에 두 가지 변화를 요구한다 :

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

    3.당신은 그들 중 하나만 가져 오는 있습니다

    당신은 그들 중 하나만 가져 오는 있습니다

    당신은 한 동안 하나 그 일을 모두 가져올 필요

    $sql = "SELECT tagname FROM tags ORDER BY rand() LIMIT 10";
    $result = mysql_query($sql);
    while($row = mysql_fetch_object($result)) {
        echo "<a href='index.php'>" .$row->tagname. " </a>";
    }
    
  4. from https://stackoverflow.com/questions/9945691/doing-a-while-loop-to-get-10-random-results by cc-by-sa and MIT license