2

任何可以帮助我的人将不胜感激。

目标:我想随机显示一张表中的 id,并确保当前用户没有看到它。

两张表:offers, has_seen

我想从 offer 中选择一个随机 id,对照 has_seen 表进行检查。

如果has_seen中存在该ID,则需要重新选择另一个随机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

我认为这可以通过执行左连接然后检查空值在普通 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

以下是使用 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
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 回答
0

我总是更喜欢将表格的内容读入数组并从那里使用它们。根据您计划使用结果的方式,您可以通过只读取一次然后从数组中提供服务来减少对数据库的访问(然后,我想,为下一个会话更新 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

感谢您的回答。我重新设计了将其提供给用户的方式,并相信当我网站上的数百人同时使用这种新方式时,效率会更高。

谢谢!

于 2012-07-03T19:54:38.617 回答