使用MySQL随机选择行

时间:2009-10-04 22:01:31

标签: php mysql codeigniter

从一个表中随机选择记录;我是否必须始终在PHP中设置临时变量?我需要一些帮助来选择CodeIgniter模型中的随机行,然后每次查看我的主页时在视图中显示三个不同的行。有没有人对如何解决这个问题有任何想法?提前谢谢!

5 个答案:

答案 0 :(得分:5)

如果你没有大量的行,你可以简单地说:

SELECT * FROM myTable ORDER BY RAND() LIMIT 3;

如果你有很多行,这会很慢,但对于较小的数据集,它会正常工作。

史蒂夫米歇尔在他的回答中提到,这种方法对于大型桌子来说会变得非常难看。他的建议是一个跳下去的好地方。如果你知道表格中的近似最大整数PK,你可以做一些事情,比如在一个和你的最大PK值之间生成一个随机数,然后一次抓取一个随机行,如:

$q="SELECT * FROM table WHERE id >= {$myRandomValue}";
$row = $db->fetchOne($q); //or whatever CI's interface to grab a single is like

当然,如果你需要3个随机行,你将在这里有三个查询,但由于它们完全在PK上,它们会很快(比整个表随机化)。

答案 1 :(得分:4)

我会做类似的事情:

SELECT * FROM table ORDER BY RAND() LIMIT 1;

这将以随机顺序放置数据,然后仅返回该随机顺序中的第一行。

答案 2 :(得分:2)

你需要这样的查询:

SELECT * 
FROM tablename
WHERE somefield='something'
ORDER BY RAND() LIMIT 3

取自第二个结果 http://www.google.com/search?q=mysql+random 它应该工作;)

答案 3 :(得分:2)

如果表非常大,可以通过rand()订购一个大表非常昂贵。 MySQL需要构建一个临时表并对其进行排序。如果您有主键并且知道表中有多少行,请使用LIMIT x,1来获取随机行,其中x是您想要获取的行数。

答案 4 :(得分:2)

我在生产中有这段代码来获取随机引用。使用MySQL的RAND功能非常慢。即使数据库中有100个引号,我也注意到网站上的延迟时间。有了这个,就没有任何滞后。

$result = mysql_query('SELECT COUNT(*) FROM quotes');
$count = mysql_fetch_row($result);
$id = rand(1, $count[0]);
$result = mysql_query("SELECT author, quote FROM quotes WHERE id=$id");