2013-01-24 17:03:41
今天整到了一个要随机获取数据的一个小功能,所以在mysql 和 mssql 2000下都尝试了一下
oracle都会吧 不管是用rand还是用rowid都比较容易获取随机数据,就不说了
当然mssql 2005以上也有了rowid一手 也比较容易获取了
先说MySQL下:
最简单的:
SELECT * FROM table ORDER BY rand() LIMIT 10;
如果你数据库数据量不是很大 不是什么上十万上百万级的这个方法是比较简单同时响应速度也是能接受的
但如果数据库很大
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()
如有高手路过 请不吝赐教
![可怜](http://static.blog.csdn.net/xheditor/xheditor_emot/default/cute.gif)