【问题标题】:Return random rows from database without repeating从数据库中返回随机行而不重复
【发布时间】:2012-10-02 15:24:32
【问题描述】:

我正在做一个测验,我将问题存储在表格中,每次提出一个问题时,我都希望显示另一个问题。我试过使用rand():

select * from quiz order by rand() LIMIT 1

但行正在重复。

还有什么我可以使用的方法来获取随机行但不会再次遇到相同的问题吗?

【问题讨论】:

  • 他们不能重复多久?问题的数量是否有限?您是否希望您的用户在看到重复问题之前检查数据库中的所有问题?
  • 从性能的角度来看,使用 ORDER BY RAND() 语句通常是个坏主意。无论如何,如果您想使用它,只需在查询中添加分组,例如 GROUP BY quiz_id 或其他一些唯一标识符,以消除重复。
  • 是的,我希望用户一次性完成所有问题
  • 然后只需选择所有数据并使用 php 随机播放结果。

标签: php mysql


【解决方案1】:

您可以使用会话和您的测验 ID。

例如

select * from quiz order by rand() LIMIT 1

在会话测验中添加测验ID:

if(!$_SESSION['quiz']) { $_SESSION['quiz'] = array(); }
$_SESSION['quiz'][] = $row['id'];

并调用 NOT IN:

$session = implode(", ", $_SESSION['quiz']);
$query = "select * from quiz WHRE `id` NOT IN (".$session.") order by rand() LIMIT 1";

【讨论】:

    【解决方案2】:

    只需获取上一个返回行的id 并将其从以后的查询中排除。

    select * from quiz WHERE id NOT :previous_id order by rand() LIMIT 1
    

    【讨论】:

      【解决方案3】:

      如果您要求用户以随机顺序完成所有问题一次,则必须跟踪每个用户的单独“播放列表”。最好使用会话:

      session_start();
      
      if (!$_SESSION['ids']) {
          $_SESSION['ids'] = $db->getAllQuestionIdsFromTheDatabase();
                          // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                          // Leaving this up to you.
      
          shuffle($_SESSION['ids']);
      
          // $_SESSION['ids'] should now look like array(42, 12, 75, ...);
      }
      
      $question = $db->getQuestionById(array_shift($_SESSION['ids']));
      ...
      

      您可以在数据库中使用ORDER BY RAND() 或在PHP 中使用shuffle 进行随机化,两者都可以。

      【讨论】:

        【解决方案4】:

        是的,您可以选择所有行(或其中一些行)并使用shuffle(),主要是因为ORDER BY RAND() 确实是资源不友好,它实际上会重新查询表格的每一行,分配一个随机数 ID,然后传递结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-05
          • 2011-03-24
          • 2014-09-11
          • 1970-01-01
          • 2017-11-13
          • 2016-02-01
          • 2019-06-01
          • 2016-03-04
          相关资源
          最近更新 更多