先说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 后面就是限制随机获取的多少数据,这个就是真正随机获取数据了,不过还是有点不满意,因为好像是永远在一些范围内变动......
再说MS SQL 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)
其中10就是要随机获取的数量 但是有个10*x这个 这是x是随机数 用来随机分页获取10个数据然后和前面使用newid获取的真正的随机数据联合在一起 这样怎么都会返回大于10条的数据
问题到这里解决了 但是我还延伸了一下 如果要各个分类下都获取一些随机数据怎么办呢?
我暂时只能想到用 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()