我有如下的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()执行速度很慢,有时它不起作用。所以任何人都可以让我知道如何正确处理这种情况,以便我的页面正常工作。
答案 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()
很慢。查询读取所有记录,然后在没有索引的情况下对它们进行排序。
如果您在0
和MAX(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条记录。