我有一个名为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>;