0

我有一个名为主题的表,其中有一个名为 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();
}

这将重定向到 domainname.com/topicname

4

2 回答 2

1

第一的。使用数据库

您应该在同一个表中添加一个日期时间字段,让我们说“displayed_on”,当您显示一个主题时,将其 display_on 设置为当前时间。现在,当您下次获取记录时,您可以对 display_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 条记录时重置会话变量。

于 2012-07-24T16:55:57.367 回答
0

这将是您的基本查询:

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>;
于 2012-07-24T16:54:45.443 回答