要求是在前台一页面上循环显示随机的5张图片(字段类型为uniqueidentifier)---而且是定时循环--我在 global中加入了一个定时器----间隔时间后会重新读取实现循环---改的是服务器端---
,----这个已经实现了,(也可以分组显示,这时是可以控制显示位置的)
---------但是后台有个需求:新加入一张图片时,要求在前台第一次发生循环时必须显示,既然是用:
select top 5 *  from etw_info where  order by  newid() 这种方式了,那又如何保证必须显示呢,
------急求:大家在碰到这种需求时是如何解决的呢(个人认为目前这样的需求是矛盾的)---
------请简要列举数据库表的字段设计,及前台如何和后台进行比较好的一个中和效果!!!!

解决方案 »

  1.   

    top 4 并union 最新一张-- 以创建时间.
      

  2.   

    加个变量,新增,变量=true,取上述sql, 定时开始,设变量=false, 取原定义sql.
      

  3.   

    既然是随机取5 
    那top 5怎么能解决啊
    再有 是否可以保证每次仅添加一张?
    可能要加个字段表示图片是否已经被显示了至少一次
      

  4.   

    惊醒:按照这个思路,那只要是不多于5张都可以的(多于5张就只能取前5张了),可以用2个dataset来存,最后在拼接,可以判断在从现在到间隔时间内添加的数量,如果是2,就top 3 如果是3 就top 2..... 
    --------------------
    谢谢,我试试--
      

  5.   

    惊醒:按照这个思路,那只要是不多于5张都可以的(多于5张就只能取前5张了),可以用2个dataset来存,最后在拼接,可以判断在从现在到间隔时间内添加的数量,如果是2,就top 3 如果是3 就top 2..... 
    --------------------
    谢谢,我试试--
      

  6.   


    写的时候要注意,取top 4时要加上不能与最新一张重复的条件
      

  7.   

    create table etw_info(id int)
    insert into etw_info select 1
    insert into etw_info select 2
    insert into etw_info select 3
    insert into etw_info select 4
    insert into etw_info select 5
    insert into etw_info select 6
    insert into etw_info select 7
    insert into etw_info select 8
    insert into etw_info select 9select * from (
    select top 4 *  from etw_info where id not in(select top 1 id from etw_info order by id desc) order by  newid()
    union all
    select top 1 * from etw_info order by id desc ) tb类似这个,9总会显示,变换其他非9的4条记录,例子用的id,楼主可以用你的id或时间字段取top1
      

  8.   

    ---以下是我根据需求写的一个sql语句,高手帮我改下,能不能把里边的那个top 4,3,2之类的用个参数替换一下,感觉太冗余了---其中4500为两次调用的时间间隔(就是定时器定义的时间,不过这个是s)
    declare @time int
    select @time=count(*) from recommend where datediff(s,inserttime,getdate())<4500
    --print @time
    if @time=1
    --只有1条新添加记录时,随机取4条记录 + 1条新添加记录
    begin 
    select top 4 * from recommend where orderlevel not in 
    (                                                                  
    select top 1 orderlevel
    from recommend
    order by datediff(s,inserttime,getdate())

    order by newid()
    select top 1  *
    from recommend
    order by datediff(s,inserttime,getdate())
    end 
    --有2条新添加记录时,随机取3条记录 + 2条新添加记录
    else if @time=2
    begin
    select top 3 * from recommend where orderlevel not in
    (
    select top 2 orderlevel from recommend
    order by datediff(s,inserttime,getdate())
    )
    order by newid()
    select top 2 *
    from recommend order by datediff(s,inserttime,getdate())
    end
    --有3条新添加记录时,随机取2条记录 + 3条新添加记录
    else if @time=3
    begin
    select top 2 * from recommend where orderlevel not in
    (
    select top 3 orderlevel from recommend
    order by datediff(s,inserttime,getdate())
    )
    order by newid()
    select top 3 *
    from recommend order by datediff(s,inserttime,getdate())
    end
    --有4条新添加记录时,随机取1条记录 + 4条新添加记录
    else if @time=4
    begin
    select top 1 * from recommend where orderlevel not in
    (
    select top 4 orderlevel from recommend
    order by datediff(s,inserttime,getdate())
    )
    order by newid()
    select top 4 *
    from recommend order by datediff(s,inserttime,getdate())
    end
    --有5条或者大于5条新添加记录时,直接取5条新添加记录
    else if @time>4
    begin
    select top 5 *  from recommend
    order by datediff(s,inserttime,getdate())
    end
    ------------------------------------谢谢-----------
      

  9.   

     
    ----十分感激楼上各位;以下是部分调用代码
    if (ds.Tables.Count > 0)
            {
                for (int i = 1; i < ds.Tables.Count; i++)
                {
                    ds.Tables[0].Merge(ds.Tables[i]);
                }
                Referpages.DataSource = ds.Tables[0];
                Referpages.DataBind();
            }
      

  10.   

    declare @time int
    select @time=count(*) from recommend where datediff(s,inserttime,getdate()) <4500
    --print @time
    select * from (select top (5-@time) * from recommend where orderlevel not in
    (
    select top (@time) orderlevel from recommend order by datediff(s,inserttime,getdate())
    ) order by newid()
    union all
    select top (@time) * from recommend order by datediff(s,inserttime,getdate())
    )tp
    是sql2005吗?
      

  11.   

    2000 用exec('select top '+@time+' from .....')
      

  12.   

    用union all 报错的:
    select * from (
    select top 5 * from recommend where orderlevel not in
    (
    select top 1 orderlevel from recommend order by datediff(s,inserttime,getdate())
    ) order by newid()
    union all
    select top 1 * from recommend order by datediff(s,inserttime,getdate())
    )tp
    ------------------------
    服务器: 消息 104,级别 15,状态 1,行 1
    如果语句中包含 UNION 运算符,那么 ORDER BY 子句中的项就必须出现在选择列表中。
      

  13.   

    select a.* from (select top 4 * from [表] where [字段] not in (select top 1 [字段] from [表] order by [字段] desc) order by newid()) as a
    union all
    select b.* from (select top 1 * from [表] order by [字段] desc) as b
      

  14.   

    加一个字段
    其用途是看是否已经被调用过 
    或者可以理解为是否为新加入的
    等到新加入的被调用了之后
    把新加入的这个字段改成false 或者其他 证明它已经被调用过~
    行不行?
      

  15.   

    --- 
    declare @sql nvarchar(600)
    declare @time int 
    declare @count int
    select @time=count(*) from recommend where datediff(s,inserttime,getdate()) <10377print @time
    if @time>5
     begin
    select top 5 * from recommend order by datediff(s,inserttime,getdate())
      end 
    else
    begin
    set @count=5-@time
    set @sql=('select top '+ Convert(varchar(50) ,@count) +' * from recommend
     where orderlevel not in
    (select top  '+ Convert(varchar(50) ,@time)+' orderlevel 
    from recommend order by datediff
    (s,inserttime,getdate())) order by newid()')exec('select top '+@time+'
     * from recommend order by datediff(s,inserttime,getdate())')
    exec sp_executesql @sql
    end
    -----------------高手帮忙优化下---现在测试可以用的---
      

  16.   

    服务器: 消息 104,级别 15,状态 1,行 1
    如果语句中包含 UNION 运算符,那么 ORDER BY 子句中的项就必须出现在选择列表中。
    解决union后orderby问题的方法create table etw_info(id int,ty int)
    insert into etw_info select 1,1
    insert into etw_info select 2,1
    insert into etw_info select 3,1
    insert into etw_info select 4,1
    insert into etw_info select 5,1
    insert into etw_info select 6,1
    insert into etw_info select 7,1
    insert into etw_info select 8,2
    insert into etw_info select 9,2declare @time int
    select @time=count(*) from etw_info where ty=2select * from (select * from (select top (5-@time) * from etw_info where id not in(select top (@time) id from etw_info where ty=2) order by newid())taunion allselect * from (select top (@time) * from etw_info where ty=2 order by id)tb)tp
      

  17.   

    把order by 的子句用select * from ()别名 扩起来,然后再union all
    外面的select * from ()tp只是清楚点
      

  18.   

    问题已经解决了,谢谢各位----不过 深有感触啊
    -------最后sql
    create proc ShowImageAgain
    as
    declare @sql nvarchar(600)
    declare @time int 
    declare @count int
    select @time=count(*) from recommend where datediff(s,inserttime,getdate()) <10377  --定时器间隔时间
    set @count=5-@time
    set @sql=('select * from (
    select * from (select top  '+ Convert(varchar(50) ,@count) +' * from recommend
     where orderlevel not in
    (select top  '+ Convert(varchar(50) ,@time)+' orderlevel 
    from recommend order by datediff
    (s,inserttime,getdate())) order by newid()) ta
    union all
    select * from (select top '+Convert(varchar(50),@time)+'
    * from recommend order by datediff(s,inserttime,getdate()))tb)tp ')
    exec sp_executesql @sql