2

私を助けてくれる人なら誰でも大歓迎です。

目標: 1 つのテーブルの ID をランダムに表示し、現在のユーザーに表示されないようにしたいと考えています。

2 つのテーブル: offershas_seen

オファーからランダムな ID を選びたいので、has_seen テーブルと照合します。

ID が has_seen に存在する場合は、別のランダム ID を選択し直す必要があります。現在のセッションのどのユーザーにも、同じ ID が表示されることはありません。

ランダムなものを選択し、他のテーブルをチェックし、見つかった場合はループバックする方法を理解できないようです。

私はこれを試しました

$query = $this->db->query("SELECT * FROM ".$this->offer_table." WHERE NOT EXISTS (SELECT * FROM ".$this->shown_table." WHERE ".$this->shown_table.".camp_id = ".$this->offer_table.".camp_id AND ".$this->shown_table.".usercode = ".$this->session->userdata("table")." LIMIT 1 ");
4

5 に答える 5

1

これは、左結合を実行してからnullをチェックすることにより、プレーンSQLで実現できると思います。

の線に沿った何か

SELECT * FROM table1 LEFT JOIN table2 USING (shared_key) WHERE table2.id IS NULL ORDER BY rand() LIMIT 1
于 2012-07-02T23:53:52.440 に答える
0

私は常に、テーブルの内容を配列に読み込んで、そこから操作することを好みます。結果をどのように使用するかによっては、一度だけすべてを読み取ってから配列から提供することで、db アクセスを削減できます (その後、次のセッションのために has_seen テーブルを更新すると思います)。

PHP を書いてから何年も経っているので、疑似コードについてはお詫びしなければなりません。

配列を取得すると、アルゴリズムは次のようになります。

var array
var end = array.length

function getNextRandomUnseen
{
  var i = rand(end)
  var temp = array[i]
  array[i] = array[end--]
  return temp
}

必要に応じて、表示された値を配列の最後に貼り付けて、失われないようにすることもできます。

array[end+1] = temp
于 2012-07-03T01:20:50.187 に答える
0

CI の db クラスを使用してそれを行う方法は次のとおりです。

 // the maximum ID that is acceptable
$max = $this->db->get('first_table')->count();

while(true) {
    // get a random number
    $randomID = rand(0,$max);

    // the condition for which we will check the has_seen table
    $condition = array(
        'id' => $randomID
    );

    // if count is 0, it has not been seen. We add it to the table and return
    // if it has been seen, the loop will repeat
    if ($this->db->get_where('has_seen', $condition)->count() === 0) {
        $this->db->insert('has_seen', array(
            'id' => $randomID
        ));
        return $randomID;
    }
}
于 2012-07-02T23:48:09.083 に答える
0

答えてくれてありがとう。私はそれがユーザーにもたらされる方法を作り直しましたが、私のサイトに何百人もの人々が一度にいるということになると、新しい方法がはるかに効率的であると信じています.

ありがとう!

于 2012-07-03T19:54:38.617 に答える
0
SELECT * FROM `offers` WHERE `camp_id` NOT IN (SELECT `camp_id` FROM `has_seen` WHERE `user code` = 1) ORDER BY RAND() LIMIT 1
于 2012-07-03T00:12:04.750 に答える