·您当前的位置:首页 > 技术教程 > PHP教程 >

[php]php随机从数据库中随机读取n条不重复记录

时间:2014-09-15 12:27酷播
最近需要从数据库中随机读取n条不重复记录,发现网上好多都是用SELECT * FROM test ORDER BY rand() LIMIT 0,n

最近需要从数据库中随机读取n条不重复记录,发现网上好多都是用SELECT * FROM test ORDER BY rand() LIMIT 0,n
当数据库量大的时候排序好像费不少时间!
于是就自己写了一个,希望高手指点一二!

test的结构

id  test
-----
1  asdfasfdasdf
2  sdfsdfsdf
...   ...

  1. <?php 
  2.  
  3. //假设数据库已经连接了 
  4.  
  5. $n = 10;  //随机显示的记录数 
  6. $results = $result = array();  //记录结果的数组 
  7.  
  8. $rowNum = mysql_result(mysql_query("SELECT COUNT(*) AS cnt FROM test"), 0, 0); 
  9.  
  10. if($rowNum < 50) { //数据量小的话,这样反而可以提高效率,当然50可以随便改 
  11.  
  12. $query = mysql_query("SELECT * FROM test ORDER BY rand() LIMIT 0,$n"); 
  13. while($result = mysql_fetch_array($query)) { 
  14. $results[$result['id']] = $result
  15.  
  16. else { 
  17.  
  18. //随机的范围 
  19. $maxNum = mysql_result(mysql_query("SELECT MAX(vid) AS cnt FROM test"), 0, 0); 
  20. $minNum = 1; 
  21. $midNUm = intval($maxNum / 2); 
  22.  
  23. //随机的id 
  24. $randId = null; 
  25.  
  26. //已存在的id集合 格式为 xx,xx,xx,xx 
  27. $existId = ''
  28. $comma = ''
  29.  
  30. $i = 0; 
  31. while($i < $n && $minNum <= $maxNum) { 
  32.  
  33. $query = ''
  34. //再查询中剔除已存在的id 
  35. $existIdExp = $existId ? "AND id NOT IN ($existId)" : ''
  36. do
  37. mt_srand((float)microtime() * 1000000); 
  38. $randId = mt_rand($minNum$maxNum); 
  39. }while(array_key_exists($randId$results));   //如果产生id已经存在,继续随机 
  40. if($randId <= $midNUm) { 
  41. $query = mysql_query("SELECT * FROM test WHERE id <= $randId $existIdExp LIMIT 0,1"); 
  42. if($result = mysql_fetch_array($query)) { //找到记录记录内容,重新随机 
  43.  
  44. $results[$result['id']] = $result
  45. $existId .= $comma.$result['id']; 
  46. $comma = ','
  47. $i++; 
  48. else { //没有找到记录,缩小随机的范围 
  49. $minNum++; 
  50. else { 
  51. $query = mysql_query("SELECT * FROM test WHERE id >= $randId $existIdExp LIMIT 0,1"); 
  52. if($result = mysql_fetch_array($query)) { //找到记录记录内容,重新随机 
  53. $results[$result['id']] = $result
  54. $existId .= $comma.$result['id']; 
  55. $comma = ','
  56. $i++; 
  57. else { //没有找到记录,缩小随机的范围 
  58. $maxNum--; 
  59. var_dump($results); 
  60.  
  61. ?>  

 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器