2

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

横幅表由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

4 回答 4

1
SELECT FLOOR(RAND() * COUNT(*)) INTO @offset FROM banners;
SELECT * FROM banners LIMIT @offset, 1;
于 2012-06-11T10:44:09.530 回答
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;
于 2012-06-11T10:38:02.887 回答
0

假设你可以忍受小比赛窗口,你可以做

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

并将其放入$bannercount,下一次运行

SELECT * FROM banners ORDER BY banner_id LIMIT $bannercount,1
于 2012-06-11T10:38:49.857 回答
0

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

于 2012-06-11T10:39:05.877 回答