主题:  见鬼了!!这条sql语句太奇怪了.

Lukiya

职务:普通成员
等级:1
金币:0.0
发贴:59
#12004/12/20 2:06:56
string sSql = "SELECT TOP 5 SongID,SongName,ListenHits,DownHits FROM Songs WHERE SingerID = "+singerid+" ORDER BY ListenHits+DownHits DESC";


当TOP 1和TOP 2时分别正常返回1行和2行数据.

当大于3时就返回所有行纪录(例如TOP 3、TOP4、TOP5),怎么回事?!?!?!?

第一次遇见这么奇怪的问题。



缺缺

职务:管理员
等级:8
金币:41.0
发贴:9620
#22004/12/20 8:49:25
后面多出来的几条的记录的ListenHits+DownHits相等.



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#32004/12/20 9:12:39
可以加再加DISTINCT (ListenHits+DownHits),或者在显示时只显示前5条


非常大鱼

Lukiya

职务:普通成员
等级:1
金币:0.0
发贴:59
#42004/12/20 18:54:38
…………
那我该怎么办?

有没有什么方法让他们按点击总数排列,并且只显示 TOP N指定的条数??



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#52004/12/20 19:56:19
for 1 to 5显示前5条就可以了


非常大鱼

Lukiya

职务:普通成员
等级:1
金币:0.0
发贴:59
#62004/12/20 22:00:00
但是我要计算结果的数量,
因为结果可能不满5呀.

加DISTINCT后会减少结果的,不能用

郁闷.



东边日出

职务:普通成员
等级:1
金币:0.0
发贴:76
#72004/12/21 14:17:07
曾经遇到过一次.因为我是的后面是.ORDER BY x_time DESC,改成ORDER BY x_ID DESC就成了.
就是说,当按时间排列时,如果有时间相同的记录时,它会全列出来.而自动编号的ID号是唯一的.



Lukiya

职务:普通成员
等级:1
金币:0.0
发贴:59
#82004/12/21 15:53:38
再说一次,用for循环可能会出现索引溢出错误.

For(int i=0;i<5;i++)
{
Response.Write(dv[i]["Name"]);
}

比如只有2条纪录,那么会报告索引错误的。
如果加了if判断又会增大程序开销,有没有Sql语句的办法直接规定提取多少条?
因为如果不够sql也不会提取错误的。



不是高手

职务:普通成员
等级:3
金币:5.0
发贴:1352
#92004/12/21 16:11:03
晕啊,你用FOR了你循环的时候当然要判断一下拉
if rs.eof then exit for



Lukiya

职务:普通成员
等级:1
金币:0.0
发贴:59
#102004/12/21 17:50:07
汗,C#里有EOF的用法??

找到解决办法了,晕,原来用嵌套查询如此简单.大家都学一招吧.

SELECT TOP "+amount.ToString()+" * FROM (SELECT SongID,SongName,ListenHits,DownHits FROM Songs WHERE SingerID = "+singerid+" ORDER BY (ListenHits+DownHits) DESC)";



缺缺

职务:管理员
等级:8
金币:41.0
发贴:9620
#112004/12/21 18:40:29
if(i>dv.Count)break;



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#122004/12/21 21:02:33
问题应该尽量简单化,虽然可用嵌套,但是在必要时才用的,嵌套的效率肯定不如简单的查询,尽量不要去做这样查询。在ASP程序中控制输出条数好了。


非常大鱼