|
主题: 见鬼了!!这条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程序中控制输出条数好了。
非常大鱼
|