我有一个名为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();
}
这将重定向到domainname.com/topicname
答案 0 :(得分:1)
首先。 使用数据库
你应该添加一个日期时间字段,让我们说“display_on'在相同的 表,当您显示主题时,将其displayed_on设置为current 时间。现在,当您下次获取记录时,您可以应用升序 排序到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条记录时,应重置会话变量。
答案 1 :(得分: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>;