`

获取指定表中随机一行记录

    博客分类:
  • SQL
阅读更多

来源:http://www.hxstrive.com/article/48.htm

 

1、随机排序后获取第一行

        获取随机记录的常见SQL做法,就是对查询结果进行随机排序,然后获取第一行。如:select * from bugs order by rand() limit 1;

        这种方法在数据据量非常小的时候,性能不会有什么大的影响。如果数据量非常庞大时,这将是致命的(因为你需要遍历整个表进行排序)。如果采用随机函数的返回值进行排序,则排序就跟记录本身没有任何关系,则每次排序后的数据是不一样的,这样数据的排序就不能被复用。使用随机函数排序,则不能使用数据库的索引进行排序,索引排序是非常快的。不使用索引排序的后果就是不得不遍历整张表(这是非常慢的)。随机排序的另一个问题就是,好不容易对整个数据进行了排序,但是只用了一条数据,太浪费了。

 

2、在表格ID最大和最小值之间选择一个随机数

        通过数据库或者程序中的随机函数,生成一个指定表ID最小值到最大值之间的随机数。然后将显示这个随机数指定的记录。如下:

select b1.* from bugs as b1 join (select ceil(rand()*(select max(bug_id) from bugs)) as rand_id) as b2 on (b1.bug_id = b2.rand_id);

 

注意:

    要求主键值必须从1开始到最大值,且是连续的。如果漏掉了某些值,则可能获取不到数据(缺点)。如Bugs表:

bug_id(Bug编号) name(Bug名称)

1 BugName01

2 BugName02

4 BugName04

6 BugName06

 

随机获取Bugs表中的一条记录:

select ceil(rand()*(select max(bug_id) from bugs));

有rand() * 6 ==>,如果rand()=0.9,则0.9*6=5.4,向下取整后等于5,从上面的表中可以看出bug_id=5的记录不存在。

 

3、随机找到的下一个有效值

        与上面的方案类似,但解决了表中在最小值和最大值之间存在缝隙的情况,这个查询会返回它随机找到的第一个有效的值。如下:

select b1.* from bugs as b1 join (select ceil(rand()*(select max(bug_id) from bugs)) as rand_id) as b2 where b1.bug_id>=b2.bug_id order by b1.bug_id limit 1;

 

        这个方法解决了没有随机数对应的主键值,即方法2的问题。但是在缝隙后面的第一列的选中几率会随着缝隙的增大而增大。如下:

bug_id(Bug编号) name(Bug名称)

1 BugName01

2 BugName02

100 BugName001

        在上面这章表中随机数字位于3到100之间的都将选中bug_id=100的这条记录,那么bug_id=100这条记录的选中概率将非常高。

 

注意:

    当表中数据向ID值之间的缝隙不大并且每个值要被等概率选中的重要性不高时可以考虑这种方案

 

 

 

分享到:
评论

相关推荐

    delphi 开发经验技巧宝典源码

    0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用快捷键保存数据 150 0227 密码只允许输入8位或超过8位 150 0228 如何获取汉字拼音简码 ...

    delphi 开发经验技巧宝典源码06

    0224 利用ADO获取DELETE后所影响的记录数 148 7.3 业务实现数据处理技术 149 0225 随机产生中奖号码 149 0226 使用快捷键保存数据 150 0227 密码只允许输入8位或超过8位 150 0228 如何获取汉字拼音简码 ...

    PHP程序开发范例宝典III

    实例227 使用聚集函数First或Last求数据表中第一条或最后一条记录 352 8.10 多表查询 354 实例228 使用select语句进行多表查询 354 实例229 使用表的别名 355 实例230 合并多个结果集 356 8.11 嵌套查询...

    C#全能速查宝典

    1.1.18 ReadLine方法——从当前流中读取一行字符 20 1.1.19 typeof运算符——获得系统原型对象的类型 21 1.1.20 using关键字——引入命名空间 22 1.1.21 WriteLine方法——写入流 23 1.2 数学方法类——Math 25 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例077 跳过数据输出中指定的记录 111 实例078 执行指定次数的循环 112 2.7 自定义函数 113 实例079 自定义函数截取中文字符串 113 实例080 公告标题的截取 114 实例081 论坛内容的简短输出 116 实例082 自定义函数...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例077 跳过数据输出中指定的记录 111 实例078 执行指定次数的循环 112 2.7 自定义函数 113 实例079 自定义函数截取中文字符串 113 实例080 公告标题的截取 114 实例081 论坛内容的简短输出 116 实例082 自定义函数...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    实例034 使用goto语句在数组中搜索指定图书 42 第3章 字符串处理技术 44 3.1 字符及字符串转换 45 实例035 将字母全部转换为大写或小写 45 实例036 字母与ASCII码的转换 46 实例037 汉字与区位码的转换 48 实例038 ...

    《Excel应用大全》示例文件 光盘文件

    • 标识商品销售表中红色字体的记录 • 按照商品采购表中的数值格式显示查询结果 • 提取指定单元格的公式表达式 • 根据立方体指定参数计算公式结果 • 提取固定字符间隔的零件规格号 第3篇 创建图表和图形 • ...

    EXCEL集成工具箱V6.0

    最大的优点是将指定的任意区域按每个存储格内容为一行加入到当前批注中,允许批注内容中是否显示行号。 【连接字符串】 可视化地窗体连接字符串功能。能将最多三个任意区域存储格(或列)的内容按自定的分隔符号...

Global site tag (gtag.js) - Google Analytics