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」と言うことができます。トピックを表示するときは、そのdisplayed_onを現在の時刻に設定します。これで、次にレコードを取得するときに、displayed_on フィールドに昇順ソートを適用し、結果を制限して、以前に表示された (または最近表示された) ものをスキップすることができます。

select vTopicName from (select * from topics order by rand() limit
    30) order by displayed_on asc limit 5;

2番。セッションの使用

表示されたすべてのトピックをセッション変数に入れて、次の一連のトピックをフェッチするときにそれらをスキップすることもできます。

$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 に答える