如何在不重复的情况下从MySQL数据库表中获取随机值


how to get random values from the MySQL database table without repeating?

我有一个名为topics的表,其中有一个字段名为vTopicName。我想通过点击按钮来显示随机主题,而不重复它们——它的SQL查询应该是什么??

在控制器中,我调用

public function browse()
{
    $data['topic'] = $this->topics_model->get_random_topic();
    $topic = $data['topic']['vTopicName'];
    redirect("/$topic");
}

模型中有

public function get_random_topic()
{
    $query = $this->db->query("SELECT * FROM ws_topics ORDER BY RAND() LIMIT 1");
    return $query->row_array();
}

THis将重定向到domainname.com/topicname

首先使用数据库

你应该添加一个日期时间字段,比如说"displayed_on"表,当您显示主题时,将其displayed_on设置为当前时间现在,当您下次提取记录时,可以应用升序排序为displayed_on字段,并将结果限制为跳过这些结果之前显示的(或最近显示的)。

select vTopicName from (select * from topics order by rand() limit
    30) order by displayed_on asc limit 5;

第二使用会话

您还可以将所有显示的主题放在会话变量中,并可以在获取下一组主题时跳过它们。

$query = "select vTopicName from topics where topics.id not in (".implode(',',$_SESSION['displayed_topics']).") order by rand limit 5;

如果表中的记录很少,那么当从上面的查询中获得的记录少于5条时,应该重置会话变量。

这将是您的基本查询:

SELECT * FROM vTopicName WHERE displayed = false ORDER BY RANDOM() LIMIT 1

然后,您必须将该主题"标记"为显示的主题。如果不知道表上的主要id,很难说如何做到这一点,但这里有一个近似值:

UPDATE vTopicName SET displayed = true WHERE primaryId = <id of the row you got>

然而,如果你想让不同的用户受到不同的影响,你需要一个单独的表格来涵盖他们的行为:

SELECT * FROM vTopicName as topic 
  JOIN userActivity AS user ON topic.id = user.topicid 
 WHERE user.displayed = false ORDER BY RANDOM() LIMIT 1;

然后您需要更新userActivity表:

UPDATE userActivity SET displayed = true WHERE topicid = <topic id> AND id = <userid>

为了确保用户在看到所有内容后可以使用所有主题,您还必须运行以下查询:

SELECT COUNT(topicid) FROM userActivity WHERE id = <user id> AND displayed = false;

如果这等于0(或某个较低的数字),则必须运行:

UPDATE userActivity SET displayed = false WHERE id = <user id>;