从mysql查询中随机打印一行


Print a random row from a mysql query

我正在寻找一种创建协作翻译小部件的方法。所以我有一个mysql数据库和表(称为翻译),还有一个小脚本,允许用户一次翻译一个页面。

但我不太相信我的剧本。我认为它不够有效。首先,mysql获取所有带有空"en"列的行,然后在一段时间内通过屏幕显示其中的一行。有其他方法吗?这是代码:

//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"Col,那就更好了!(我认为这是不可能的)。"en"行是文本,所以我不知道如何实现我见过的其他方法,因为它们在ORDER BY中使用数字。

您可以在查询中使用ORDER BY RAND() LIMIT 1从数据库中提取一个随机行。

在查询端进行

SELECT * FROM translations WHERE en IS NULL OR en='' ORDER BY rand() LIMIT 0,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);
相关文章: