我有一个“横幅”表,其中包含图像名称和图像文件路径,每次访问者导航到另一页时都会随机查看。
横幅表由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。这是最好的做法吗?如果是这样,我该怎么做?
我完全公开任何有助于我做我想做的事情的新想法。
请帮我弄清楚这个问题......
由于
感谢。
答案 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创建一个数组,并从该数组生成随机数