zid = (select top 1 zid from bookz as c where c.bookid=a.bookid  order by c.updates desc,c.zid desc) 
是不是可以改变位置
select top 100 a.bookid,a.btitle,b.jtitle,c.zid,c.ztitle from 
(select * from books where zid = (select top 1 zid from bookz as c where c.bookid=a.bookid  order by c.updates desc,c.zid desc))as a 
join bookj as b on a.bookid=b.bookid 
join bookz as c on a.bookid=c.bookid 
where b.jid = c.jid order by a.hits desc,a.bookid desc

解决方案 »

  1.   

    To:dutguoyizid = (select top 1 zid from bookz as c where c.bookid=a.bookid  order by c.updates desc,c.zid desc) 
    是不是可以改变位置
    select top 100 a.bookid,a.btitle,b.jtitle,c.zid,c.ztitle from 
    (select * from books where zid = (select top 1 zid from bookz as c where c.bookid=a.bookid  order by c.updates desc,c.zid desc))as a 
    join bookj as b on a.bookid=b.bookid 
    join bookz as c on a.bookid=c.bookid 
    where b.jid = c.jid order by a.hits desc,a.bookid desc================
    你的这一句 select * from books where zid = (select …………有错误啊因为books表里面根本就没有zid这个字段啊还是谢谢了!!!
    ================继续求助!!!!!!!!!
      

  2.   

    这个是体力活;字段说明不够,本来就很乱,还要猜你字段作用,另请了
    如果我写的话,索引加的好,估计10秒内能top 5000.
    zid加个索引看看。
      

  3.   

    To:Athoncj这个是体力活;字段说明不够,本来就很乱,还要猜你字段作用,另请了
    如果我写的话,索引加的好,估计10秒内能top 5000.
    zid加个索引看看。================
    我以为我字段标得很清楚了 :(  
    与之相关的数据库结构如下:
    作品表:books(bookid<作品ID>,btitle<作品名称>,classid<作品类别ID>,hits<作品点击数>)记录数 万级
    分卷表:bookj(jid<分卷ID>,jtitle<分卷名称>,bookid<分卷所属作品ID>)    记录数 十万级
    章节表:bookz(zid<章节ID>,ztitle<章节名称>,bookid<章节所属作品ID>,jid<章节所属分卷ID>,updates<本章更新时间>)   记录数 百万级
    分类表:class(classid<分类ID>,classname<分类名称>)
    (主键、索引都是默认id,递增<如bookid,jid,zid,classid 都是主键和索引?>,其他字段均未做任何索引或优化等)
    所以zid已经是索引了……要求输出格式如下(类似):分类名称        作品名称    分卷名称       章节名称    作品点击数
    TestClassName1  TestBook1   TestFenjuan1   TestChap1    100
    TestClassName2  TestBook2   TestFenjuan2   TestChap2    90
    TestClassName3  TestBook3   <NULL>         <NULL>       80
    TestClassName4  TestBook4   TestFenjuan4   TestChap4    70其中Books表里面的内容,对应的Boosj和Bookz里面可能找不到内容(因为该作品还没有章节),但是又要求输出(即使是空值),这样的话,我原先的sql语句就不行了(因为过滤了空记录),我不知道left join 或者right join怎么用……因为要做个排行榜,所以不只是按照hits排序,也有其它的如favs(收藏数)排行,只是我没有列举而已。查询后生成Html(总共14个文件,就是14个排行榜),判断后,用For Next循环14次,总耗时 75 秒 左右!!我觉得效率太低了,我知道关键就是那个很长的sql语句select那里很费时,但是又不知如何优化???
    ================继续求助!!!!!!!!!
      

  4.   

    To:Athoncj(阿龙)
    ==================
    有空帮你看下,昨天看了一刻钟,没理清你表的关系,昏。
    ==================
    急切盼望你的尽快答复!!!
    附上一个热心人士的思路:
    ------------------------------
    你这个里面最耗时的操作是排序,而且是两个大排序。如果先从作品表中查询出200个点击率高的作品生成临时表(输出:{分类名称,作品ID,作品名称,点击数}),再与其它表关联查询出临时表中的200个作品的最新章节(输出:{分类名称,作品名称,分卷名称,章节名称,点击数}),就从两个大排序(万级、百万级)转化为一个大排序(万级)一个超小规模排序(200),且先后独立进行,应该能够提高性能、减轻负荷。如果你目前的方法能在3秒完成,那么这样修改后应该能在0.5秒左右完成。
    你自己测试吧,我这没环境。也可不用临时表,而把它做为子查询,这样就能用一个复合SQL语句查询出来,而且性能应该比用临时表更佳。select ...
    from (select top 200 ... from ... where ... order by ... desc) as TOP200, ...
    where ...
    order by ... desc你自己完成它吧。
    --------------------------------
    我弄了一个早上,还是没搞清楚。
    可能是我实在是太笨了^_^因为我没有去系统地学习sql语言,只是现学现用的,发现问题,然后去尝试解决……
      

  5.   

    SELECT TOP 200 A.bookid, A.btitle, B.jtitle, C.ztitle, A.hits, D.classname, MAX(C.updates) 
          AS UPDATES
    FROM dbo.books A LEFT OUTER JOIN
          dbo.bookj B ON A.bookid = B.bookid LEFT OUTER JOIN
          dbo.bookz C ON A.bookid = C.bookid AND B.jid = C.jid LEFT OUTER JOIN
          dbo.class D ON A.classid = D.classid
    GROUP BY A.hits, A.bookid, A.btitle, B.jtitle, C.ztitle, D.classname
    ORDER BY A.hits DESC, A.bookid DESC
      

  6.   

    SELECT TOP 200 BOOKID, BTITLE, JTITLE, ZTITLE, HITS, CLASSNAME, MAX(ZID) 
          AS ZID
    FROM (SELECT A.BOOKID, A.BTITLE, B.JTITLE, C.ZTITLE, A.HITS, D .CLASSNAME, C.ZID, 
                  MAX(C.UPDATES) AS UPDATES
            FROM DBO.BOOKS A LEFT OUTER JOIN
                  DBO.BOOKJ B ON A.BOOKID = B.BOOKID LEFT OUTER JOIN
                  DBO.BOOKZ C ON (A.BOOKID = C.BOOKID AND B.JID = C.JID) 
                  LEFT OUTER JOIN
                  DBO.CLASS D ON A.CLASSID = D .CLASSID
            GROUP BY A.HITS, A.BOOKID, A.BTITLE, B.JTITLE, C.ZTITLE, D .CLASSNAME, 
                  C.ZID) A
    GROUP BY BOOKID, BTITLE, JTITLE, ZTITLE, HITS, CLASSNAME
    ORDER BY HITS DESC, BOOKID DESC