[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.참고, 진짜 대답하기 전에 반드시 읽어 :이 답변을 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.() 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.당신은 그들 중 하나만 가져 오는 있습니다
당신은 그들 중 하나만 가져 오는 있습니다
당신은 한 동안 하나 그 일을 모두 가져올 필요
$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>"; }
from https://stackoverflow.com/questions/9945691/doing-a-while-loop-to-get-10-random-results by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 서버 : 5 열 이상 동적 피벗 (0) | 2020.04.12 |
---|---|
[SQL] 쉼표는 MySQL의 "IN"절에 값을 분리 (0) | 2020.04.12 |
[SQL] 테이블에서 중복 행을 삭제 (0) | 2020.04.12 |
[SQL] 어떻게 VARCHAR (날짜)에 16 진수 변환하려면? (0) | 2020.04.12 |
[SQL] MySQL의에서 임의의 행을 선택 (0) | 2020.04.11 |