MySQL RAND()7 LIMIT

时间:2012-11-28 19:21:46

标签: sql random limit

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

SELECT * FROM tablename ORDER BY RAND() LIMIT 9

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

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

3 个答案:

答案 0 :(得分:0)

您的select只会提取表中的记录数,而不管order by。但是,在订购之前,您可以使用各种方法复制表数据。例如,行union all一起两次:

select * from
(
    select * from tablename
    union all
    select * from tablename
) as tmp
order by rand() limit 9

答案 1 :(得分:0)

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

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

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

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

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

-4。从tablename中选择*,其中id为($ id_list)

答案 2 :(得分:0)

即使表中只有一行,这也会有效。如果你的行数少于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 ;