从mysql查询中随机打印一行

5
我正在寻找一种创建协作翻译小部件的方法。因此,我有一个名为“translations”的mysql数据库和表格,并有一个小脚本允许用户逐页翻译。
但是,我对我的脚本并不完全满意。我认为它不够高效。首先,mysql获取所有具有空“en”列的行,然后通过while显示其中的单个行。还有其他的做法吗?以下是代码:
//Retrieve all the data from the "translations" table
$result = mysql_query("SELECT * FROM translations WHERE en IS NULL OR en=''") or die(mysql_error());

$Randnum=rand(0,mysql_num_rows($result)-1); //Gets a random number between 0 and the maximum number of rows
$i=0;   //Start to 0
while($Col = mysql_fetch_array($result))  //While there are rows to evaluate
    {
    if ($i==$Randnum)
        {
        echo "\"".$Col['es']."\"<br><br>Translate it to English: <br>";
        }
    $i++;
    }

我正在寻找类似于“echo $Col[$Randnum]['es']”或“echo $Col.$Randnum['es']”这样的东西,而不是使用整个while循环来打印单个随机行。如何实现这一点?如果只是优化问题。如果您能提供一个脚本或想法来分配给$Col只有一个带有随机数字和空的“en”列的行,那就更好了!(我认为最后一部分不可能)。'en'行是文本,所以我不知道如何实现其他方法,因为它们使用ORDER BY中的数字。
3个回答

7
您可以在查询中使用ORDER BY RAND() LIMIT 1来获取数据库中的单个随机行。

它能处理文本吗?即使它能工作,它不会选择第一个ASCII为rand()所说的文本吗?(例如,如果许多行以“H”开头,它不会每次都只选择第一行,rand()是72吗?) - Francisco Presencia
@FrankPresenciaFandos:这与您表中的数据完全无关。它会为每一行内部生成一个随机数,然后按照该数字排序。 - ThiefMaster
那么它的工作方式就不像“ORDER BY en”那样,后者实际上会按照这些列内部的文本对结果进行排序。我不知道这一点,谢谢! - Francisco Presencia

2

将其放在查询端

SELECT * FROM translations WHERE en IS NULL OR en='' ORDER BY rand() LIMIT 0,1

1

有几种方法可以做到这一点。

@ThiefMaster的回答是可行的,但是在大型表上使用“order by rand()”会带来相当大的性能问题。因此,我建议您使用大致与您想要增长到的大小相同的示例数据填充表格,并测试性能。如果没有问题,就保持原样——过早优化是万恶之源!

还有一些替代方案;它们依赖于运行两个单独的查询;但是,假设您已经有了索引,那就不应该成为问题。

针对您的情况进行重新设计,变成了:

mysql_query('SELECT @count := COUNT(*) FROM translations WHERE en IS NULL OR en=''');
mysql_query('SET @offset = CONVERT(FLOOR(RAND() * @count), SIGNED)');
mysql_query('PREPARE mystatement FROM "SELECT * FROM translations WHERE en IS NULL OR en='' LIMIT ?, 1"');
$res = mysql_query('EXECUTE mystatement USING @offset');
$row = mysql_fetch_assoc($res);
print_r($row);

我不认为这个表将来会增长到2000/3000行以上,但感谢您扩展了信息。我也喜欢那句话“过早优化是万恶之源”。 - Francisco Presencia
这不是我的 - 有人指出在任何东西前面加上“过早”的话都会让它听起来很糟糕... - Neville Kuyt
抱歉,我的意思是感谢你的引用,让我在互联网上阅读了很多不同有趣的东西。(; - Francisco Presencia

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