日期:2014-05-17  浏览次数:21096 次

如何随机从数据库中取数据,但某些标识的记录必须被取到
设计了表-tablename
ID   +
subject   char
linkurl   char
ifshow   int     1表示被选中,一定会被选取出来,0标识没选中  

请问如何随机的从tablename中取出n条数据,但ifshow=1的记录一定会被取出来??

请高手解答,跪求范例代码。

------解决方案--------------------
先选出ifshow=1的,假设有m条,再选n-m条ifshow!=1的
------解决方案--------------------
你的信誉不好,不给你代码给你方法吧设置一个字段为自增的比如有字段为ID值为1-100,那么你就可以用你也随机的函数得到一个随机的值比如得到的是:2,5,3,当然你的随机函数是想取多少个都可以的可是范围在ID值内,得到值后你就可以:select * from table_name ID in(2,5,3)来取得随机的数据了
------解决方案--------------------
假设你的n为10 的话,那么可以用这样的sql 语句达到你的目的
select top 10 * from (
(select newid() as rnd,* from t where ifshow=1
union

select * from (select top 10 newid() as rnd, * from t where ifshow =0 order by newid() ) tt))
ttt order by ifshow desc

我试出来了,先查询出所有的ifshow=1的数据,再随机查询出n(10)条ifshow=0的数据,将两段查询结果联合并排序, 即ifshow=1的数据放在前面,ifshow=0的数据放在后面,最后再从这个结果中提取前n(10)条数据,这样的话肯定是先取到ifshow=1的数据,后面再随机取到ifshow=0的数据,总数达到n(10).
当然如果全部记录加起来不到n(10)的话,那就会全部取出,但若ifshow=1的数据已经超过n(10)的话,那么就只会取到ifshow=1的数据了.
你试试,这里有比较多的查询嵌套
------解决方案--------------------
Declare @outcount int --不等于1记录数
Declare @n int --需要输出记录数
Declare @incount int --等于1记录数
Declare @SQL varchar(1000)

--两次查询,临时表记录
Create table #Temp(id int,subject varchar(255),linkurl varchar(255),ifshow int)

Select @incount=Count(*) from tablename where ifshow=1
Set @outcount = @n-@incount

Set @SQL= 'select top '+cast(@incount as varchar)+ ' * from tablename where ifshow=1 '
insert into #Temp Execute(@SQL)

Set @SQL = 'Select top '+Cast(@outcount as varchar)+ ' * from tablename where ifshow <> 1 order by newid() '
insert into #Temp Execute(@SQL)

Select * from #Temp

Drop table #Temp
------解决方案--------------------
假设你的n为10 的话,那么可以用这样的sql 语句达到你的目的
select top 10 * from (
(select newid() as rnd,* from t where ifshow=1
union

select * from (select top 10 newid() as rnd, * from t where ifshow =0 order by newid() ) tt))
ttt order by ifshow desc

==================================================================================
顶,在ACCESS里面应该也可以用newid() 吧这个就是随机读取啊