0

私のデータベーステーブルには15個のレコードがあり、画面にランダムに9個表示したいと思います。

SELECT * FROM tablename ORDER BY RAND() LIMIT 9

これは期待どおりに機能しますが、テーブルに9つのレコードしかない場合はどうなりますか?15個のランダムレコードをプルする必要があります。

これにより1つ以上のレコードが複製されることは理解していますが、それが私の意図です。

4

3 に答える 3

0

selectに関係なく、テーブル内のレコード数のみをプルしますorder by。ただし、注文する前に、さまざまな方法を使用してテーブルデータを複製できます。たとえばunion all、行を2回一緒にすると次のようになります。

select * from
(
    select * from tablename
    union all
    select * from tablename
) as tmp
order by rand() limit 9
于 2012-11-28T19:27:42.757 に答える
0

大規模なデータベースを扱う場合、RAND()自体は効率的ではありません。

このようなクエリを実行するためのより良い方法は、次のとおりです。

-1。最大のIDを照会します(idが一意のキーであると想定します)

-2。php関数のjavascriptを使用して、1からmax_idまでの15個の乱数を生成し、-arrayにプッシュします。

-3。配列を実装します(例:$ id_list = "'" .implode( "'、'"、$ id_list)。 "'")

-4。($ id_list)のidがテーブル名から*を選択します

于 2012-11-28T20:22:16.097 に答える
0

これは、テーブルに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 ;
于 2012-11-28T21:02:04.707 に答える