问一个我自己都脸红的问题啊

时间:2021-04-18 20:17:18
都做了四个左右的个人小站了,一直来都以为是这样的代码没错.


今天测试一页面时才发现这样的代码错得厉害:


错误语句: 

           SQL语句: "SELECT TOP 20 * FROM [TableName] WHERE [id]='条件' ORDER BY Time DESC";


就是上面这条语句,让我自己脸红!

 我一直以为DBMS执行上面语句时,首先跑完整个表一遍,然后把所有符合条件的记录选全部选出来,再根据Time排序,再然后才执行SELECT TOP 20这个子句的.

可是今天才发现不是这样,我测试时就发现DBMS首先执行的是SELECT TOP 20子句的,怎么办?

这不是我要的效果啊?

大家帮忙,以上语句是哪个子句先执行啊?

我这边测试时,先添加的记录没能最前显示,不会是我的语句写错了吧?????


18 个解决方案

#1


你什么数据库,

1.[id]='条件' 
2.ORDER BY Time DESC
3.TOP 20
难道不对?

#2


Time、Content、Name等名字要注意

ORDER BY [Time] DESC

SELECT TOP 20 * FROM [TableName] WHERE [id]='条件' ORDER BY [Time] DESC
试一试

#3


应该是先执行TOP20,然后ORDER BY
你可以先进行ORDER BY,在SELECT TOP 
SELECT TOP 20 * FROM
(
SELECT * FROM [TableName] WHERE [id]='条件' ORDER BY Time DESC}

随手写的,没有测试过 呵呵,就是这么个思路吧

#4


3楼的应该是正确的

#5


en 

#6


3楼正解

#7


正解?自己测试下就知道了
楼主开始理解的对


结果不是你要的也许哪里没看好的原因

#8


楼主的语句哪里错了 ?

#9


执行顺序应该没错,是不是其他的问题啊

#10


应该是一条一条的语句读,如果满足就留下来不行的话就删除,找到20条以后就结束,然后把这些记录按时间排序,如果你的记录总数不够20条的话,应该是找到几条就几条。

#11


可能是ORDER BY [Time] DESC问题,也许是没有唯一性,也许Time是特殊名字没有用[],也许和数据库有关系

我还是觉的
1.[id]='条件'  
2.ORDER BY Time DESC 
3.TOP 20 


问一个我自己都脸红的问题啊

#12


xuexi

#13


引用 8 楼 conannb 的回复:
楼主的语句哪里错了 ?



没达到20条前的我没注意正不正确,不过现在记录多后,我发现刚添加的记录没能显示出来,所以才有上一问

#14


;回复 3楼:

那个Time我也加了括号了,只是发贴时一时忘了,因为加括号是我的习惯,感觉这样可以让DBMS更快解释识别语句


回复 10楼:


如果真的是从第一条开始找到第20条,然后就结束的话,那就证明了是先执行SELECT TOP 20这个子句了.


那我问下大家哦,现在有个表,表里放存着发表的文章的记录,其中有一个字段为ReadCounts,就是文章的阅读次数,int类型的

现在我想问一下,如果我要把表里的文章根据ReadCounts来排序,也就是点击率最高的显示出来,不要多,只要点击率最高的前20条就得了,如果是你们,你们怎样写SQL语句????当然,因为可能表记录会比较多,如果用嵌套查询,是否是会很慢很慢?

#15


引用 11 楼 XPingguo 的回复:
可能是ORDER BY [Time] DESC问题,也许是没有唯一性,也许Time是特殊名字没有用[],也许和数据库有关系 

我还是觉的 
1.[id]='条件'   
2.ORDER BY Time DESC  
3.TOP 20  

#16


谢谢11楼

明天中午上来结贴

#17


有这事,还真没有注意,待会测试下。

#18


1.[id]='条件'  
2.ORDER BY Time DESC  
3.TOP 20 
原因可呢是:TOP语句可以过滤掉有重复的语句!
还得加上个关键字!具体给忘了!你可以去搜索一下TOP 语法!验证一下!

#1


你什么数据库,

1.[id]='条件' 
2.ORDER BY Time DESC
3.TOP 20
难道不对?

#2


Time、Content、Name等名字要注意

ORDER BY [Time] DESC

SELECT TOP 20 * FROM [TableName] WHERE [id]='条件' ORDER BY [Time] DESC
试一试

#3


应该是先执行TOP20,然后ORDER BY
你可以先进行ORDER BY,在SELECT TOP 
SELECT TOP 20 * FROM
(
SELECT * FROM [TableName] WHERE [id]='条件' ORDER BY Time DESC}

随手写的,没有测试过 呵呵,就是这么个思路吧

#4


3楼的应该是正确的

#5


en 

#6


3楼正解

#7


正解?自己测试下就知道了
楼主开始理解的对


结果不是你要的也许哪里没看好的原因

#8


楼主的语句哪里错了 ?

#9


执行顺序应该没错,是不是其他的问题啊

#10


应该是一条一条的语句读,如果满足就留下来不行的话就删除,找到20条以后就结束,然后把这些记录按时间排序,如果你的记录总数不够20条的话,应该是找到几条就几条。

#11


可能是ORDER BY [Time] DESC问题,也许是没有唯一性,也许Time是特殊名字没有用[],也许和数据库有关系

我还是觉的
1.[id]='条件'  
2.ORDER BY Time DESC 
3.TOP 20 


问一个我自己都脸红的问题啊

#12


xuexi

#13


引用 8 楼 conannb 的回复:
楼主的语句哪里错了 ?



没达到20条前的我没注意正不正确,不过现在记录多后,我发现刚添加的记录没能显示出来,所以才有上一问

#14


;回复 3楼:

那个Time我也加了括号了,只是发贴时一时忘了,因为加括号是我的习惯,感觉这样可以让DBMS更快解释识别语句


回复 10楼:


如果真的是从第一条开始找到第20条,然后就结束的话,那就证明了是先执行SELECT TOP 20这个子句了.


那我问下大家哦,现在有个表,表里放存着发表的文章的记录,其中有一个字段为ReadCounts,就是文章的阅读次数,int类型的

现在我想问一下,如果我要把表里的文章根据ReadCounts来排序,也就是点击率最高的显示出来,不要多,只要点击率最高的前20条就得了,如果是你们,你们怎样写SQL语句????当然,因为可能表记录会比较多,如果用嵌套查询,是否是会很慢很慢?

#15


引用 11 楼 XPingguo 的回复:
可能是ORDER BY [Time] DESC问题,也许是没有唯一性,也许Time是特殊名字没有用[],也许和数据库有关系 

我还是觉的 
1.[id]='条件'   
2.ORDER BY Time DESC  
3.TOP 20  

#16


谢谢11楼

明天中午上来结贴

#17


有这事,还真没有注意,待会测试下。

#18


1.[id]='条件'  
2.ORDER BY Time DESC  
3.TOP 20 
原因可呢是:TOP语句可以过滤掉有重复的语句!
还得加上个关键字!具体给忘了!你可以去搜索一下TOP 语法!验证一下!