从数据库随机获取数据

2013-01-24 17:03:41

今天整到了一个要随机获取数据的一个小功能,所以在mysql 和 mssql 2000下都尝试了一下

oracle都会吧   不管是用rand还是用rowid都比较容易获取随机数据,就不说了
当然mssql 2005以上也有了rowid一手  也比较容易获取了

先说MySQL下
最简单的:
SELECT * FROM table ORDER BY rand() LIMIT 10;
如果你数据库数据量不是很大 不是什么上十万上百万级的这个方法是比较简单同时响应速度也是能接受的

但如果数据库很大  就用如下的方法   此方法转载自http://www.111cn.net/database/mysql/40168.htm

SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 10;
LIMIT 后面就是限制随机获取的多少数据   但这个是获取的连续的数据块  等于是获取随机开始项的连续的数据

所以修改下:

SELECT * FROM `table`
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))
ORDER BY id LIMIT 10;
LIMIT 后面就是限制随机获取的多少数据  这个就是真正随机获取数据了    不过还是有点不满意  因为好像是永远在一些范围内变动......但迫于时间也就没研究了,希望有研究过的童鞋可以交流一下



说MSSQL 2000下的随机获取

其实也有个最简单的语句:

select top 10 * from table order by newid();

一样top后面就是获取的数据量  本来是很好就解决了的事情  但去看微软关于对newid的解释  发现他是随机过去的GUID  然后用数学的方法计算匹配出随机数据   于是问题就来了   他有时没有获取到10条数据  多次反复运行发现他有时只返回几条数据   甚至只有1条数据  这对我们的要求是不能完全满足的

所以就自己写了个语句保证一定会获取到10条随机数据
select * from (select top 10 newid() as row, * from table order by row ) as a
union all
select top 10 newid(), * from table where lsh not in (select top 10*x lsh from table)

问题到这里解决了  但是我还延伸了一下   如果要各个分类下都获取一些随机数据怎么办呢?

我暂时只能想到用 union联合起来   但是那样有几个分类就要写几个union了  但是本人没想到什么更好的注意了。不过如果在编程语言中  可以先获取所有的分类  然后循环拼接出这个语句来就可以了

语句格式如下即可:(两种皆可)
select top 5 * from table where aid=1 order by newid() 
union 
select top 5 * from table where aid=2 order by newid() 
union
select top 5 * from table where aid=3 order by newid()

select * from (
select top 2 * from table where aid=1 
union all
select top 2 * from table where aid=2 
union all
select top 2 * from table where aid=3 ) as a order by newid()

如有高手路过 请不吝赐教可怜

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值