我前面发的:高难度排序问题,急寻帮助!已结
发表于:2007-12-19 11:20:55
http://topic.csdn.net/u/20071221/21/5e4b4bbb-fb64-45de-aad8-506a6527a639.html比如有一表TTT有几个字段       
ID         
cde   
cdeid 
pid               
      
          
数据如下   ID                   cde               cdeid               pid 
1                    AAA               2                    2 
2                    DDD               1                    3 
3                    CCC               1                    1 
4                    DDD               3                    1 
5                    DDD               2                    1 
6                    DDD               1                    2 每次搜索都显示表TTT中全部数据,搜索时POST传递数据cde值 
例如搜索时cde=DDD 
排序的规则是: 
1、获取cde=DDD数据并且优先cdeid按从大到小排序然后pid按小到大排序 
2、cde不等于DDD的数据cdeid不排序,pid按小到大排序 如果能满上二条应该搜索如下结果: 
ID                   cde               cdeid               pid 
4                    DDD               3                   1 
5                    DDD               2                   1 
6                    DDD               1                   2 
2                    DDD               1                   3 
3                    CCC               1                   1 
1                    AAA               2                   2 
 我能想到的写法: 
传数据cde=DDD 目前按 账号tim_spac及其它账号的方法已经解决,写法如下
select 
    cde,cdeid,pid 
from 
    TTT 
order by 
    (case cde when 'DDD' then cdeid else 0 end) desc,pid asc 新的问题:比如有二表TTT,FFF    
            
 
FFF表数据如下 
ID                   cde               cdeid               pid 
1                    AAA               2                    2 
2                    DDD               1                    3 
3                    CCC               1                    1 
4                    DDD               3                    1 
5                    DDD               2                    1 
6                    DDD               1                    2 
    TTT表数据如下 ,FFF_ID对应TTT中的ID  
FFF_ID
1
2
3
4
5
6说明TTT表中的FFF_ID中的数据对应FFF中的ID每次搜索都显示表TTT中全部数据,搜索时POST传递数据cde值 
例如搜索时cde=DDD 
排序的规则是:以FFF_ID对应ID中的字段cde,cdeid,pid排序表TTT
1、获取cde=DDD数据并且优先cdeid按从大到小排序然后pid按小到大排序 
2、cde不等于DDD的数据cdeid不排序,pid按小到大排序 如果能满上二条应该TTT表搜索如下结果: 
FFF_ID 

5
6
2
3
1
 
 
帮高手帮下忙!

解决方案 »

  1.   


    select t1.FFF_ID
    (select   
            cde,cdeid,pid   
    from   
            TTT   
    order   by   
            (case   cde   when   'DDD'   then   cdeid   else   0   end)   desc,pid   asc  
    ) T1
      

  2.   

    楼上写的,我都没看到FFF表呀,没有FFF表怎么调cde,cdeid,pid   数据呢
      

  3.   


    select   
            ID
    from   
            FFF   
    order   by   
            (case   cde   when   'DDD'   then   cdeid   else   0   end)   desc,pid   asc  /*
    结果
    ---------------------------------
    4
    5
    6
    2
    3
    1
    */
      

  4.   

    create table FFF(ID int,  cde nvarchar(5),   cdeid int,  pid int)
    insert  FFF select 1,    'AAA',   2,    2   
    insert  FFF select 2,    'DDD',   1,    3   
    insert  FFF select 3,    'CCC',   1,    1   
    insert  FFF select 4,    'DDD',   3,    1   
    insert  FFF select 5,    'DDD',   2,    1   
    insert  FFF select 6,    'DDD',   1,    2   
            
    go
    create table TTT(FFF_ID int)
    insert TTT select 1 
    insert TTT select 2 
    insert TTT select 3 
    insert TTT select 4 
    insert TTT select 5 
    insert TTT select 6 goselect 
    a.FFF_ID
    from 
    TTT a
    left join
    FFF b on a.FFF_ID=b.ID
    order by case when b.cde='DDD' then 1 else 0 end desc, b.pid ascFFF_ID      
    ----------- 
    4
    5
    6
    2
    3
    1(所影响的行数为 6 行)