* MySQL 随机取记录
*
* @param $t 表
* @param $c ID列,默认为id
* @param $n 取多少个
* @param $w 条件语句
* @param $f bool 是否强制以多维数组形式返回,默认false
* @return array 取1个直接返回结果数组(除非$f为true),取>1个返回多维数组,用foreach取出
*/
function rand_row($t , $c = 'id' , $n = '1', $w = '' , $f = false) {
$m=new mysqli(mysqli信息,自行查找php文档)
if (!empty($w)) {
$w = ' AND '.$w
}
$sql = "SELECT * FROM `{$t}` WHERE {$c} >= (SELECT floor(RAND() * (SELECT MAX({$c}) FROM `{$t}`))) {$w} ORDER BY {$c} LIMIT {$n}"
$xq = $m->query($sql)
$r = array()
while ($x = $m->fetch_array($xq)) {
$r[] = $x
}
if ($f == false &&count($r) == 1) {
return $r[0]
} else {
return $r
}
}
一、Oracle取随机数据 1、Oracle访问数据的基本方法: 1)、全表扫描(Full table Scan):执行全表扫描,Oracle读表中的所有记录,考查每一行是否满足WHERE条件。Oracle顺序的读分配给该表的每一个数据块,且每个数据块Oracle只读一次.这样全表扫描能够受益于多块读. 2)、采样表扫描(sample table scan):扫描返回表中随机采样数据,这种访问方式需要在FROM语句中包含SAMPLE选项或者SAMPLE BLOCK选项. 注:从Oracle8i开始Oracle提供采样表扫描特性
2、使用sample获得随机结果集 2.1、语法: SAMPLE BLOCK [ SEED (seed_value) ] SAMPLE选项:表示按行采样来执行一个全表扫描,Oracle从表中读取特定百分比的记录,并判断是否满足WHERE子句以返回结果。 BLOCK: 表示使用随机块例举而不是随机行例举。 sample_percent:是随机获取一张表中记录的百分比。比如值为10,那就是表中的随机的百分之10的记录。 值必须大于等于.000001,小于100。
SEED:表示从哪条记录返回,类似于预先设定例举结果,因而每次返回的结果都是固定的。该值必须介于0和4294967295之间。
2.2、举例说明
(1)sample(sample_percent):
(2)、sample block(sample_percent)
(3)、sample block(sample_percent) seed(seed_value)
注意以下几点:
1.sample只对单表生效,不能用于表连接和远程表 2.sample会使SQL自动使用CBO
3、使用DBMS_RANDOM包 DBMS_RANDOM有两种主要的使用方法分别是:DBMS_RANDOM.VALUE()和DBMS_RANDOM.RANDOM
4、使用 内部函数sys_guid()
****注:****
在使用sys_guid() 这种方法时,有时会获取到相同的记录,即和前一次查询的结果集是一样的,查找相关资料,有些说是和 *** 作系统 有关,在windows平台下正常,获取到的数据是随机的,而在 Linux 等平台下始终是相同不变的数据集,有些说是因为sys_guid()函数本身的问题,即sys_guid()会在查询上生成一个16字节的全局唯一标识符,这个标识符在绝大部分平台上由一个宿主标识符和进程或进程的线程标识符组成,这就是说,它很可能是随机的,但是并不表示一定是百分之百的这样。
所以,为确保在不同的平台每次读取的数据都是随机的,我们大多采用使用sample函数或者DBMS_RANDOM包获得随机结果集,其中使用sample函数更常用,因为其查询时缩小了查询范围,在查询大表,且要提取数据不是很不多的情况下,会对查询速度上有明显的提高。
1. 用select count(*)得到总记录条数t;2. 用分页查找,用随机数Random得到一个0<x<t的x数,然后分页的分页数和分页量都用x
3.该分页查找得到的就是一个随机的记录。
4.循环1-3步骤,直到得到希望数量的随机记录。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)