进行一会儿/循环以获得10个随机结果

您好,我正在尝试为我的网站创建标签脚本,因此每次搜索引擎进入我的网站时,我的网站上都会显示10个不同的标签。

这些标签将从数据库中获取。因此,目前我已经对其进行了编码,因此它只能捕获一个。(因为我不知道该怎么做while

像这样

$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次吗?例如,使用相同的回显,但打印出10个结果而不是1个。…我将限制从1更改为10,但这没有用…仍然显示一个…

回答:

请停止使用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多年的历史,不再维护。社区甚至已经开始弃用它们。mysql_*2012年不应再有任何新的代码编写。而应使用PDO或MySQLi。至于如何编写(使用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随机结果,则需要对以下两项进行更改PROCEDURE:

临时表应强制条目的唯一性:

CREATE TEMPORARY TABLE rands ( tagname VARCHAR(63) UNIQUE);

仅收集ID而不收集值可能也很有意义。特别是您要查找的是10篇独特的文章,而不仅仅是标签。

当发现插入重复值时,cnt计数器不应减少。可以通过添加HANDLER(在之前定义LOOP)来确保这一点,它将“捕获”引发的警告并调整计数器:

DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET cnt = cnt + 1;

以上是 进行一会儿/循环以获得10个随机结果 的全部内容, 来源链接: utcz.com/qa/405619.html

回到顶部