使用php&;mysql

使用php&;mysql,php,mysql,random,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、网站、html等。。。 现在我需要创建一个数组,其中包含从随机记录中随机选择的大约50个标记 目前,我正在使用rand()从数据库中随机选择15个m

我有如下mysql数据库结构:

CREATE TABLE test (
    id int(11) NOT NULL auto_increment,
    title text NULL,
    tags text NULL,
    PRIMARY KEY (id)
);
字段标记上的数据存储为逗号分隔的文本,如html、php、mysql、网站、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()执行速度非常慢,有时不起作用。所以,谁能告诉我如何正确处理这种情况,使我的页面正常工作。

从不
orderbyrand()。而是在PHP中进行随机化。类似这样,因为您的ID是自动递增的(可能不是最好的方法):

顺便问一下,为什么你要把你的标签放在一个字符串列表中,只是为了以后分解这个字符串?只需从一开始就将它们放入一个数组。

决不
orderbyrand()
-这对性能很糟糕。而是在PHP中进行随机化。类似这样,因为您的ID是自动递增的(可能不是最好的方法):


顺便问一下,为什么你要把你的标签放在一个字符串列表中,只是为了以后分解这个字符串?只要从一开始就把它们放入一个数组。

我想你可能已经知道为什么
orderbyrand()
很慢了。查询读取所有记录,然后在不借助索引的情况下对它们进行排序

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

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

我想您可能已经意识到,
orderbyrand()
速度慢的原因。查询读取所有记录,然后在不借助索引的情况下对它们进行排序

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

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

例如,可以改进Marcus程序

SELECT * FROM test
WHERE id % round(rand()*(SELECT count(*) FROM test)) = 0
ORDER BY id
LIMIT 15
(而且速度也不太慢)。 唯一的问题是,上面的表达式不能保证您将获得15条记录。
你想要这样的吗?可以改进以保证15条记录。

例如,可以改进Marcus程序

SELECT * FROM test
WHERE id % round(rand()*(SELECT count(*) FROM test)) = 0
ORDER BY id
LIMIT 15
(而且速度也不太慢)。 唯一的问题是,上面的表达式不能保证您将获得15条记录。

你想要这样的吗?可以改进以保证15条记录。

这假设
自动增量
列中没有间隙。如果有间隙,可以单独选择记录。它仍然很快,因为您将为每个查询使用主键索引<代码>“从测试中选择*,其中id>=$selection LIMIT 1”
。或者,如果没有返回15行,只需获取更多行。数据库中字段标记上的数据以逗号分隔的形式存储。我将标记集存储在字符串列表中,以便验证和分解标记集,并创建一个仅包含有效和单个标记的数组。太好了,它就像一个符咒,只需稍加修改即可满足我的页面附加要求。这假设
自动增量
列中没有间隙。如果有间隙,可以单独选择记录。它仍然很快,因为您将为每个查询使用主键索引<代码>“从测试中选择*,其中id>=$selection LIMIT 1”
。或者,如果没有返回15行,只需获取更多行。数据库中字段标记上的数据以逗号分隔的形式存储。我将标记集存储在字符串列表中,这样我就可以验证和分解标记集,并创建一个只包含有效和单个标记的数组。太好了,它就像一个符咒,只需稍加修改即可满足我的页面附加要求。首先,我需要从表中选择15条随机记录。然后在数组中保存字段“tags”的数据,我需要打印50个随机标记。我认为您的示例将不起作用,因为有时数据库中可能不存在my_random_值的返回值。我本来打算采用这种方法,但后来我认为有15个具有顺序ID的条目不够随机。@Prakash,请注意
WHERE
子句中的
=
。如果您选择最小ID值和最大ID值(减去15)之间的随机值,然后选择ID大于或等于随机值的下15条记录,您将始终获得至少一条记录,大多数情况下,您将获得15条记录。如果你得到的数据少于15条,那么重复,直到得到15条。首先,我需要从表中选择15条随机记录。然后在数组中保存字段“tags”的数据,我需要打印50个随机标记。我认为您的示例将不起作用,因为有时数据库中可能不存在my_random_值的返回值。我本来打算采用这种方法,但后来我认为有15个具有顺序ID的条目不够随机。@Prakash,请注意
WHERE
子句中的
=
。如果您选择最小ID值和最大ID值(减去15)之间的随机值,然后选择ID大于或等于随机值的下15条记录,您将始终获得至少一条记录,大多数情况下,您将获得15条记录。如果你得到的数据少于15,那么重复这个过程直到你得到15。分布是否需要尽可能均匀?15条记录的限制是常数吗?不是。我只需要大约10-15个随机记录,以确保在最后得到50个随机标签。分发是否需要尽可能统一?15条记录的限制是常数吗?不是。我只需要大约10-15个随机记录,以确保我在最后得到50个随机标记。这听起来不错,但不会返回更多的记录。有时它会重新开始