随机SQL记录,同时排除特定记录


Random SQL record while excluding specific records

我有一个CodeIgniter PHP应用程序,它显示两个电影封面。旁边是一个"随机电影"按钮,它使用AJAX将两个电影替换为一组新的电影。你可以继续点击这个,一遍又一遍,看到它继续取代电影封面的图像。要显示的前两个封面设置为默认值,在用户单击随机电影按钮后,它们不应该显示。问题是:当点击随机电影按钮时,有时需要多次点击才能最终显示新封面。也就是说,相同的封面将连续多次返回。被获取的两个不同的覆盖是从稍微不同的url调用的,所以它们很少同时断开。这让我知道它是刷新的,但是该函数多次返回相同的电影。如果我直接访问通过AJAX调用的url,我从来没有看到这种情况发生,因为我已经使用Session类来存储最后一部电影,并将其从SQL查询(即WHERE id NOT IN ($default_movie, $last_movie))中排除。知道为什么直接访问url会工作良好,但通过AJAX调用时,我看到这种行为吗?

我知道这可能还不够清楚,所以如果我能澄清一些不合理的地方,请让我知道。如果有帮助的话,我将添加代码。谢谢朋友!

查询随机电影:

SELECT * FROM (`movies`) WHERE `id` NOT IN (2, 10) ORDER BY RAND() LIMIT 1

模型方法:

public function getRandom($count = 1, $featured = FALSE, $series = FALSE, $exclude = 0, $last = 0) {
        $this->db->order_by('id', 'random');
        $this->db->limit(1);
        $conditions = array();
        if ($exclude > 0) {
            $conditions['id !='] = $exclude;
        }
        if ($last > 0) {
            if (!empty($conditions['id !='])) {
                $conditionsNotIn = "id NOT IN (" . $conditions['id !=']. ", $last)";
                unset($conditions['id !=']);
                $this->db->where($conditionsNotIn);
            } else {
                $conditions['id !='] = $last; 
            }
        }
        if ($featured) {
            $conditions['featured'] = 1;
        }
        if ($series) {
            $conditions['current_series'] = 1;
        }
        $movie = $this->db->get_where('movies', $conditions);
        $movie = $movie->row();
        if (!is_null($movie)) {
            return $movie;
        } else {
            return FALSE;
        }
    }

是否知道为什么直接访问url会工作得很好,但是当通过AJAX调用,我看到这种行为?

我有一个主意。

浏览器缓存。皮塔饼!

尝试显式关闭缓存:

$.ajaxSetup({cache: false});

放在ajax请求之前,假设您正在使用jQuery。