你好我正在尝试为我的网站制作一个标签脚本,所以每当一个搜索引擎进入我的网站时,我的网站上会显示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>";
Run Code Online (Sandbox Code Playgroud)
无论如何我可以添加一段时间,所以它做了10次?例如,使用相同的回声,但打印出10个结果而不是1 ....我已经将限制从1更改为10但是这不起作用...仍然显示一个...
ter*_*ško 27
请停止使用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 */
Run Code Online (Sandbox Code Playgroud)
如果要生成随机结果,请创建一个生成它们的存储过程.像这样的东西(从本文中获取的代码,您应该阅读):
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 ;
Run Code Online (Sandbox Code Playgroud)
要使用它,你会写:
CALL get_rands(10);
SELECT * FROM rands;
Run Code Online (Sandbox Code Playgroud)
至于在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);
}
Run Code Online (Sandbox Code Playgroud)
如果要求不仅要获得10个随机结果,而且实际上要获得10 个UNIQUE随机结果,则需要对以下内容进行两次更改PROCEDURE:
临时表应该强制条目的唯一性:
CREATE TEMPORARY TABLE rands ( tagname VARCHAR(63) UNIQUE);
Run Code Online (Sandbox Code Playgroud)
收集ID而不是值也可能是有意义的.特别是如果你要找的是10篇独特的文章,而不仅仅是标签.
找到插入重复值时,cnt计数器不应减少.这可以通过添加HANDLER(在定义之前LOOP),"捕获"引发的警告并调整计数器来确保:
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET cnt = cnt + 1;
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
1583 次 |
| 最近记录: |