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);

ちょっと待って。これらのバナーの1つを削除するとどうなりますか?

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

この場合、ランダム出力が「2」になるとどうなりますか?「2」のbanner_id'd行はありませんか?したがって、乱数範囲からDELETEDIDを除外する必要があります。これがベストプラクティスになりますか?もしそうなら、どうすればそれを行うことができますか?

私は自分がやりたいことをするのに役立つ新しいアイデアを完全に受け入れています。

この問題を理解するのを手伝ってください...

ありがとう

ありがとう。

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から1つの配列を作成し、その配列からランダムな数値を生成します

于 2012-06-11T10:39:05.877 に答える