从mysql查询中打印一个随机行

时间:2012-04-01 19:06:48

标签: php mysql optimization

我一直在寻找一种创建协作翻译小部件的方法。所以我有一个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'行是文本,因此我不知道如何实现other methods我已经看到了,因为他们使用ORDER BY编号。

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

在查询方面进行

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

答案 2 :(得分:1)

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

@ ThiefMaster的答案将起作用 - 但“按rand()排序”在大型表上存在相当大的性能问题。因此,我会使用大致相当于您希望增长的大小的样本数据来填充表格,并测试性能。如果它不是问题,那么保持原样 - 过早的优化是所有邪恶的根源!

有一些alternatives;他们依靠运行两个单独的查询;但是,假设你有指数,那应该不是问题。

为你的观点重做,这变成:

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);