如何从MySQL数据库表中获取随机值而不重复?

时间:2012-07-24 16:50:34

标签: php mysql

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

2 个答案:

答案 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>;