从 MySQL 中获取随机行并用 PHP 显示

3
我想选择我的表中的引用和作者行并将其回显。 我的目标是创建一个随机引语生成器并显示实际的引语和作者。 我已经在我的表中输入了25个引语,其中包含3行(ID、引语、作者)。 我的代码如下,但我一直收到资源ID#9错误。
<?php

mysql_select_db(name of database);

$quotes = "SELECT author AND quote FROM inspirational_quotes ORDER BY RAND() LIMIT 1";

$result = mysql_query($quotes);

WHILE ($row = mysql_fetch_array($result)):
ENDWHILE; 

echo "$result";
?>

请帮忙。

4
使用"select author,quote"代替"select author AND quote",可行吗?请帮我翻译这句话。 - mallix
1
两件事。1)ORDER BY RAND()在规模上确实不可扩展,当只有几百条记录时还好,但当有几千条记录时,你会感到一些痛苦。当有几百万条记录时,你就完了。请查看书籍SQL Antipatterns以获取替代方案。2)PHP中的mysql_*函数已被弃用,除了名称之外。您应该切换到更现代的东西,如PDO或Mysqli。 - GordonM
同一天的每个访问者是否会看到相同的随机引语? - Cups
不,它不会,它将针对每个新页面加载。 - Bez Soltani
Rand() 应该没问题,因为我只有25个引用!感谢您的所有帮助。 - Bez Soltani
5个回答

7
首先,我认为您想要...
<?php

mysql_select_db(name of database);
$quotes = "SELECT author,quote FROM inspirational_quotes ORDER BY RAND() LIMIT 1";
$result = mysql_query($quotes);

WHILE ($row = mysql_fetch_array($result)):
ENDWHILE; 

echo "$result";
?>

但是我有一个额外的建议

预加载所有引用ID

CREATE TABLE quoteID
(
    ndx int not null auto_increment,
    id int not null,
    PRIMARY KEY (ndx)
);
INSERT INTO quoteID (id) SELECT id FROM inspirational_quotes;

现在根据quoteID表的id进行选择。
SELECT B.author,B.quote FROM quoteID A INNER JOIN inspirational_quotes B
USING (id) WHERE A.ndx = (SELECT CEILING(MAX(ndx) * RAND()) FROM quoteID);

这应该可以很好地扩展,因为@rnd_id的返回值来自于quoteID表中没有间隙的id列表。

<?php

mysql_select_db(name of database);
$quotes = "SELECT B.author,B.quote FROM quoteID A INNER JOIN "
. "inspirational_quotes B USING (id) "
. "WHERE A.ndx = (SELECT CEILING(MAX(ndx) * RAND()) FROM quoteID)";

$result = mysql_query($quotes);

$row = mysql_fetch_array($result);

echo "$result";
?>

来试一试吧!!!


我优化了查询和ID集合。 - RolandoMySQLDBA

1
为什么AND只是逗号。
SELECT author, quote FROM inspirational_quotes ORDER BY RAND() LIMIT 1

MySQL Select语法


1

我建议您使用PHP随机化结果以提高性能。例如:

$r = mysql_query("SELECT count(*) FROM inspirational_quotes");
$d = mysql_fetch_row($r);
$rand = mt_rand(0,$d[0] - 1); 
$r = mysql_query("SELECT author,quote FROM inspirational_quotes LIMIT $rand, 1");

1

你不能将 $result 作为字符串输出。

    WHILE ($row = mysql_fetch_array($result)):
     echo $row['author'] . " " . $row['quote'];
ENDWHILE; 


?>

1

你没有回显正确的变量。

echo $row['author'] . ": " . $row['quote'];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接