【问题标题】:How to select random ID's from database excluding deleted ones?如何从数据库中选择随机 ID,不包括已删除的 ID?
【发布时间】:2012-06-11 10:32:26
【问题描述】:

我有一个“横幅”表,其中包含图像名称和图像文件的路径,每次访问者导航到另一个页面时都会随机查看这些文件。

banners 表由banner_id(auto_increment、unique、primary、tinyint)、banner_name(varchar)和banner_path(varchar)字段组成。

横幅表格可以通过控制面板进行编辑。新的横幅将被添加,一些横幅将在一段时间后被删除,并且可能会被更新。一般的 CRUD 操作,你懂的……

现在...由于我的目标是随机显示横幅,我需要一个随机数生成器函数来排除特定的横幅。

为了更清楚,

假设我的表如下所示:

banner_id     banner_name     banner_path
---------     ------------    ------------
1             First Banner    first_banner.jpg
2             Second Banner   second_banner.jpg
3             Third Banner    third_banner.jpg

我可以通过使用这样的PHP函数轻松获取随机ID:mt_random(1, 3);

但是等等。如果我删除这些横幅之一怎么办?

banner_id     banner_name     banner_path
---------     ------------    ------------
1             First Banner    first_banner.jpg
3             Third Banner    third_banner.jpg

在这种情况下,当随机输出变为“2”时,会发生什么?没有“2”banner_id'd 行?所以我必须从随机生成器编号范围中排除 DELETED id。这会是最好的做法吗?如果是这样,我该怎么做?

我完全愿意接受任何有助于我做我想做的事情的新想法。

请帮我解决这个问题...

谢谢

谢谢。

【问题讨论】:

    标签: php mysql codeigniter random


    【解决方案1】:
    SELECT FLOOR(RAND() * COUNT(*)) INTO @offset FROM banners;
    SELECT * FROM banners LIMIT @offset, 1;
    

    【讨论】:

      【解决方案2】:

      假设您可以忍受较小的比赛窗口,您可以这样做

      SELECT FLOOR(RAND()*COUNT(*)) AS bannercount FROM banners;
      

      并将其提取到$bannercount,下一次运行

      SELECT * FROM banners ORDER BY banner_id LIMIT $bannercount,1
      

      【讨论】:

      • 嗯..我对这个答案不太清楚。您能解释一下这种方法如何为我提供随机性吗? :s
      • #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FLOOR(RAND()*4),1' at line 1 甚至不能在 phpMyAdmin SQL 窗口中工作?我错过了什么? :s
      • 不知道 MySQL 会阻塞计算 - 将其移至 SELECT 阶段,现在可以使用。
      • 是的,它成功了!谢谢你。它经常重复相同的结果,但我认为这与不是那么大的行数和 MySQL 随机引擎有关,对吧?
      【解决方案3】:

      为什么不直接选择一个随机行而不是使用 PHP 选择一个随机 ID 来显示?

      SELECT * FROM `banners` ORDER BY RAND() LIMIT 0,1;
      

      如果你有一个 ID 数组要排除

      SELECT * FROM `banners` 
      WHERE `banner_id` NOT IN (/* array values*/) 
      ORDER BY RAND() LIMIT 0,1;
      

      【讨论】:

      • 因为 thiw 是性能杀手:它将获取所有横幅,为每个横幅计算 RAND(),然后订购,然后除一个之外全部丢弃。
      • @EugenRieck 解释得很清楚:)
      【解决方案4】:

      您将从可用的 id 创建一个数组并从该数组生成随机数

      【讨论】:

        猜你喜欢
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 2021-10-20
        • 2017-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        相关资源
        最近更新 更多