从表中随机获取多行

时间:2010-12-02 07:06:58

标签: php mysql random

现在我正在使用ORDER BY Rand();从表中选择3个随机行,正如在整个网络上指出的那样,这个方法非常慢。我在只有30行的数据库上使用它,并且返回值需要很长时间。我发现的大多数其他解决方案只返回一行。返回多个随机行的最佳方法是什么?

$get_projects_query = 
  mysql_query(
    "SELECT p_id FROM project_data WHERE p_featured='1' ORDER BY Rand() LIMIT 3"
  ) or die(mysql_error());

while($project_row = mysql_fetch_array($get_projects_query)) {?>
  //Do stuff
} 
//end three random featured projects loop)

4 个答案:

答案 0 :(得分:1)

首先选择表计数。按索引列排序(可能是主键)。然后使用offset =选择限制1到0到表计数范围内的随机整数。

答案 1 :(得分:1)

如果只有30行,您还有其他选择。

选项#1

  1. 获取所有30行。
  2. call shuffle()
  3. 阅读前三个
  4. 选项#2

    1. 从0到29生成3个随机数。称它们为r1,r2,r3。
    2. SELECT ... WHERE p_id IN(r1,r2,r3)
    3. 选项#3

      1. SELECT p_id FROM ...
      2. while($ row = mysql_fetch_assoc($ result))$ idList [] = $ row [“p_id”];
      3. 洗牌($ IDLIST)
      4. SELECT ... WHERE p_id IN($ idList [0],$ idList [1],$ idList [2])

答案 2 :(得分:0)

如果您只有30行,为什么不将所有30行下载到您的客户端,然后生成3个随机行索引

答案 3 :(得分:0)

正如其他人所说的那样。查询中只有30个项目是这样的:

  1. 在没有RAND()
  2. 的情况下进行查询
  3. 使用所有项目构建数组/对象 - 例如: items []
  4. 在1和数组长度之间生成3个随机数(x1,x2,x3),然后显示它们: items [1],items [2],items [3]
  5. 或者您的查询目前只有30个结果,但是时间会越来越大?