首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL RAND() 7限制

MySQL RAND() 7限制
EN

Stack Overflow用户
提问于 2012-11-29 03:21:46
回答 3查看 3K关注 0票数 0

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

代码语言:javascript
复制
SELECT * FROM tablename ORDER BY RAND() LIMIT 9

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-29 03:27:43

无论order by如何,您的select将只拉取表中的记录数。但是,在对表数据进行排序之前,可以使用各种方法复制表数据。例如,将行union all放在一起两次:

代码语言:javascript
复制
select * from
(
    select * from tablename
    union all
    select * from tablename
) as tmp
order by rand() limit 9
票数 0
EN

Stack Overflow用户

发布于 2012-11-29 04:22:16

在处理大型数据库时,RAND()本身并不高效。

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

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

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2012-11-29 05:02:05

即使表中只有1行,这也会起作用。如果您的行数少于15行(例如11行),则结果中将包含全部11行和4行以上的随机行:

代码语言:javascript
复制
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() ;

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

代码语言:javascript
复制
            AS b
    ORDER BY RAND()
        LIMIT 15
  ) AS t15 ;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13612789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档