排除特定记录时的随机 SQL 记录

Posted

技术标签:

【中文标题】排除特定记录时的随机 SQL 记录【英文标题】:Random SQL record while excluding specific records 【发布时间】:2013-05-31 00:14:14 【问题描述】:

我有一个显示两个电影封面的 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;
        
    

【问题讨论】:

你能发布完整的 SQL 查询吗 您是否验证了 AJAX 请求正确填充了 $default_movie$last_movie 变量? 是的,我已经添加了查询。我还利用 CI 的 log_message() 来跟踪变量每次都在变化。 虽然这不是随机的,但为什么不简单地按顺序返回列表中的每个项目。用户不知道有什么不同,一旦你走到尽头,你就知道你没有电影了。更多优雅的解决方案。 @Chris 这似乎是可行的,而且似乎应该可行。让我尝试一下,看看是否有所作为。 【参考方案1】:

知道为什么直接访问 url 可以正常工作,但是当 通过 AJAX 调用,我看到了这种行为?

我有个主意是的。

浏览器缓存.. PITA!

尝试显式关闭缓存:

$.ajaxSetup(cache: false);

假设您使用的是 jQuery,请将其放在您的 ajax 请求之前。

如果你不是,你需要在 url 中附加一些随机变量,这样可以防止浏览器缓存请求。

【讨论】:

以上是关于排除特定记录时的随机 SQL 记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 如果两个特定字段都为空,则从视图中排除记录

SQL Server - 随机随机播放结果,但为每条记录分配权重

Oracle随机选择一条记录SQL

sql 一对多关系随机查一条

SQL Server - 每个状态拉 X 个随机记录

sql 从表中选择随机n%记录