随机数据使用php& MySQL的

时间:2010-04-20 16:28:00

标签: php mysql random

我有如下的mysql数据库结构:

CREATE TABLE test (
    id int(11) NOT NULL auto_increment,
    title text NULL,
    tags text NULL,
    PRIMARY KEY (id)
);

字段标签上的数据存储为逗号分隔文本,如html,php,mysql,website,html等... 现在我需要创建一个包含随机记录中大约50个随机选择标签的数组。

目前我正在使用rand()从数据库中选择15个随机mysql数据,然后保存数组中15条记录中的所有标记。然后我使用array_rand()来随机化数组并只选择50个随机标签。

$query=mysql_query("select * from test order by id asc, RAND() limit 15");
$tags="";
while ($eachData=mysql_fetch_array($query)) {
    $additionalTags=$eachData['tags'];
    if ($tags=="") {
        $tags.=$additionalTags;
    } else {
        $tags.=$tags.",".$additionalTags;
    }
}

$tags=explode(",", $tags);
$newTags=array();
foreach ($tags as $tag) {
    $tag=trim($tag);
    if ($tag!="") {
        if (!in_array($tag, $newTags)) {
            $newTags[]=$tag;
        }
    }
}

$random_newTags=array_rand($newTags, 50);

现在我在数据库上有很多记录,正因为如此; rand()执行速度很慢,有时它不起作用。所以任何人都可以让我知道如何正确处理这种情况,以便我的页面正常工作。

3 个答案:

答案 0 :(得分:3)

永远不会ORDER BY RAND() - 表演太可怕了。而是在PHP中进行随机化。这样的事情,因为你的ID是自动递增的(可能不是最好的方法):

$count = mysql_fetch_assoc(mysql_query("select count(1) as count from test"));
$range = range(0, $count['count']);

$selection = array_rand($range, 50);
$sel_list = implode(',', $selection);

$query = mysql_query("select * from test where id in ($sel_list)");

顺便说一下,为什么要将标签放在字符串列表中,以后才会爆炸?只需从头开始将它们放入数组中。

答案 1 :(得分:0)

我认为您可能已经意识到为什么ORDER BY RAND()很慢。查询读取所有记录,然后在没有索引的情况下对它们进行排序。

如果您在0MAX(id) - 15之间选择一个随机数并获得接下来的15行,那么它是否足够随机?记录是否以无序方式输入?

SELECT * FROM test
WHERE id >= my_random_value
ORDER BY id
LIMIT 15

答案 2 :(得分:0)

马库斯程序可以改进,例如

SELECT * FROM test
WHERE id % round(rand()*(SELECT count(*) FROM test)) = 0
ORDER BY id
LIMIT 15

(并不是太慢)。 唯一的问题是上述表达式并不能保证您将获得15条记录。 你想要这样的东西吗?它可以改进以保证15条记录。