0

我的数据库表有 15 条记录,我想在屏幕上随机显示 9 条。

SELECT * FROM tablename ORDER BY RAND() LIMIT 9

这按预期工作,但如果表只有 9 条记录怎么办?我需要提取 15 条随机记录。

我知道这会复制一个或多个记录,但这是我的意图。

4

3 回答 3

0

当您处理大型数据库时,RAND() 本身效率不高。

进行此类查询的更好方法是:

-1。查询最大的id(假设id为唯一键)

-2。使用 php 函数的 javascript 生成从 1 到 max_id 的 15 个随机数,推送到 -array

-3。内爆数组(例如 $id_list = "'".implode("', '", $id_list)."'")

-4。Select * from tablename where id in ($id_list)

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

如果您想要“更多”随机性,在结果中有重复或三次重复的行,可能有些行根本没有显示,请将最后五行替换为:

            AS b
    ORDER BY RAND()
        LIMIT 15
  ) AS t15 ;
于 2012-11-28T21:02:04.707 回答
0

select无论order by. _ 但是,在订购表格数据之前,您可以使用各种方法复制表格数据。例如,union all将行放在一起两次:

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