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
是不是可以改变位置
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
解决方案 »
- 关于Business Intelligence(BI系统)的问题
- 朋友们,会写SQL语句,如何熟练掌握事务的用法,现在手头又没什么可以练习的,真不知道如何精通某一门技术,唉!
- 求SQL函数用法:把日期型2008-01-01 00:00:000 转成varchar'20080101'和相反转换两个函数表示
- 混合模式认证,是不是可以只提供sa+密码,客户机不必用任何Windows帐号与服务器匹配了?
- 求一sql语句
- MSSQL2000能在未接网线的计算机上安装吗?
- 这个sql应该怎么写?等待...
- 在一个数据库中建多个全文搜索影响多大
- 为什么我的SQL Server中找不到DTS?
- 紧急求救,关于误删除了表sysobjects中的所有记录后,数据库不能打开问题
- 求一个查询语句优化的问题,速度实在是慢
- 怎么给列取别名
是不是可以改变位置
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这个字段啊还是谢谢了!!!
================继续求助!!!!!!!!!
如果我写的话,索引加的好,估计10秒内能top 5000.
zid加个索引看看。
如果我写的话,索引加的好,估计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那里很费时,但是又不知如何优化???
================继续求助!!!!!!!!!
==================
有空帮你看下,昨天看了一刻钟,没理清你表的关系,昏。
==================
急切盼望你的尽快答复!!!
附上一个热心人士的思路:
------------------------------
你这个里面最耗时的操作是排序,而且是两个大排序。如果先从作品表中查询出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语言,只是现学现用的,发现问题,然后去尝试解决……
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
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