Mysql:兰德一次排序

时间:2013-01-13 12:27:50

标签: php mysql random sql-order-by

我需要通过rand订购,但我不希望它在每次刷新时都需要改变,我需要一个随机,这是否有意义?

这是我的代码:

function findSimilarByTag($gid,$limit=5) {
  $gid=$this->quotesmart($gid);
  $limit=$this->quotesmart($limit); //yes, this is senseless

  $db =& JFactory::getDBO();
  $query ="SELECT count( a.cid ) , a.gid, b.* \r\n";
  $query.="FROM `#__yfl_game2cat` a \r\n";
  $query.="JOIN #__yfl_game b ON a.gid = b.id
        WHERE a.cid
        IN (
        SELECT cid
        FROM #__yfl_game2cat
        WHERE gid = '$gid'
        )
        AND a.gid != '$gid'
        GROUP BY a.gid
        ORDER BY rand()
        LIMIT ".$limit;

  $db->setQuery($query);
  $games=$db->loadObjectList();
  if($db->getErrorMsg()) $games=$db->getErrorMsg();
  return $games;

3 个答案:

答案 0 :(得分:2)

让所有用户看到相同的随机顺序

如果您希望每个人都使用相同的随机顺序,只需添加另一列,您可以在其中放置随机生成的数字并按该列排序。

每位用户:

如果结果集相同(即没有其他数据更改),您可以将整个结果集存储在会话中。

session_start();// top of all php files that need to use session

if (isset($_SESSION['findSimilarByTag'])) $rs=$_SESSION['findSimilarByTag'];
else $rs=$_SESSION['findSimilarByTag']=findSimilarByTag($gid);
// ... go ahead and use $rs

如果结果中的其他数据发生变化,或者结果集中存在大量数据,则可以存储唯一ID,如果该会话值存在,则使用ORDER BY FIELD(fieldname, 1,2,3...)代替ORDER BY RAND()

答案 1 :(得分:2)

不是在SELECT上随机化,而是为随机值创建一个列,在SELECT时将它填充到INSERT和ORDER BY那一列上。

这样,您的结果将始终以预定义的“随机”顺序返回。

答案 2 :(得分:0)

我不知道你的意思,但我可以告诉你,你可以使用整数参数操纵RAND()。像RAND(10,15)一样会创建10到15之间的随机数。至于返回“一个随机”然后,我会存储$rand = "ORDER by RAND()";然后设置一个会话并检查isset()以查看RAND是否有已经设置过一次或没有。