私のデータベーステーブルには15個のレコードがあり、画面にランダムに9個表示したいと思います。
SELECT * FROM tablename ORDER BY RAND() LIMIT 9
これは期待どおりに機能しますが、テーブルに9つのレコードしかない場合はどうなりますか?15個のランダムレコードをプルする必要があります。
これにより1つ以上のレコードが複製されることは理解していますが、それが私の意図です。
select
に関係なく、テーブル内のレコード数のみをプルしますorder by
。ただし、注文する前に、さまざまな方法を使用してテーブルデータを複製できます。たとえばunion all
、行を2回一緒にすると次のようになります。
select * from
(
select * from tablename
union all
select * from tablename
) as tmp
order by rand() limit 9
大規模なデータベースを扱う場合、RAND()自体は効率的ではありません。
このようなクエリを実行するためのより良い方法は、次のとおりです。
-1。最大のIDを照会します(idが一意のキーであると想定します)
-2。php関数のjavascriptを使用して、1からmax_idまでの15個の乱数を生成し、-arrayにプッシュします。
-3。配列を実装します(例:$ id_list = "'" .implode( "'、'"、$ id_list)。 "'")
-4。($ id_list)のidがテーブル名から*を選択します
これは、テーブルに1行しかない場合でも機能します。行数が15未満(たとえば11)の場合、結果には11のすべてに加えて、さらに4つのランダムな行が含まれます。
SELECT col1, col2, ..., colN -- the columns of `tablename` only
FROM
( SELECT a.i, b.j, t.*
FROM
( SELECT *, RAND() AS rnd
FROM tablename
ORDER BY rnd LIMIT 15
) AS t
CROSS JOIN
( SELECT 1 AS i UNION ALL SELECT 2 UNION ALL
SELECT 3 UNION ALL SELECT 4 )
AS a
CROSS JOIN
( SELECT 1 AS j UNION ALL SELECT 2 UNION ALL
SELECT 3 UNION ALL SELECT 4 )
AS b
ORDER BY i, j, rnd
LIMIT 15
) AS t15
ORDER BY RAND() ;
結果に重複または三重の行があり、一部の行がまったく表示されていない可能性がある、「より多くの」ランダム性が必要な場合は、最後の5行を次のように置き換えます。
AS b
ORDER BY RAND()
LIMIT 15
) AS t15 ;