【问题标题】:Mysql: Order by rand just one timeMysql:按兰特订购一次
【发布时间】:2013-01-13 12:27:49
【问题描述】:

我需要按 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;

【问题讨论】:

  • 什么是随机的?
  • 他想重新组织结果,但以某种方式存储这个重新组织而不是在每个视图上随机化
  • 如果您只需要 一个随机数,那么您的限制必须始终为一个...除非查询仅返回一条记录...默认情况下...:$
  • 听起来你可以使用缓存(例如基于文件或内存的缓存)。
  • 这是每个用户还是您希望所有用户看到相同的“一次随机”顺序?

标签: php mysql random sql-order-by


【解决方案1】:

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

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

每位用户:

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

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()(如果该会话值存在)

【讨论】:

  • 但不是所有用户都有自己的缓存副本吗?我的意思是,在极端情况下,如果所有用户都是不同的人,每个人只有一次访问,那么它的行为就像在每个请求中随机化一样。
  • OP 没有指定这是针对整个站点或每个用户的。已提出问题。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-18
      • 2018-03-04
      • 2018-03-31
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多