簡體   English   中英

如何從MySQL數據庫表中獲取隨機值而無需重復?

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

我有一個名為主題的表,其中有一個名為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

第一。 使用數據庫

您應該在同一表中添加一個datetime字段,讓它說“ displayed_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條記錄時,應重置會話變量。

這將是您的基本查詢:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM