如何从数据库中选择随机ID,不包括已删除的ID?

时间:2012-06-11 10:32:26

标签: php mysql codeigniter random

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

横幅表由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。这是最好的做法吗?如果是这样,我该怎么做?

我完全公开任何有助于我做我想做的事情的新想法。

请帮我弄清楚这个问题......

由于

感谢。

4 个答案:

答案 0 :(得分:1)

SELECT FLOOR(RAND() * COUNT(*)) INTO @offset FROM banners;
SELECT * FROM banners LIMIT @offset, 1;

答案 1 :(得分:0)

为什么不选择随机行而不是使用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;

答案 2 :(得分:0)

假设您可以使用小型比赛窗口,您可以

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

并将其提取到$bannercount,然后再次运行

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

答案 3 :(得分:0)

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