表1:主表
tid,class_id,from_id,level表2:相关信息表
id,tid,userid
用语言表达是这样的:
先选出 表1中的10条数据(更具tid倒序),出来的结果再次用level排序再这个10条数据当中再表2中匹配tid=表1中的tid,并且userid=xxx。如果有的那么把表1出来的10条结果中对应tid编号的放入第一个结果。。如果有多个匹配,那么多个匹配的条目再更具表2各id 排序也就是说表2.id的值越大。排序就越前面。

解决方案 »

  1.   

    select * from 
    (select top 10 * from table1 order by tid desc,level asc) as a
    left join table2 as b on a.tid = b.tid and b.userid = xxx
    order by b.id desc
      

  2.   


    select * from 表2 A
    inner join 
    (
    select top 10 * from 表1
    order by tid  desc,level asc
     B
    on A.tid=B.tid
    where A.userid=xxx
    order by a.tid desc
      

  3.   

    hellowork 谢谢啊。上次的问题也是你帮助我的。问题基本已经解决了。但是有还有点小问题。,首先
    连续的两个order by条件似乎没有正确的排序啊。
    我这里tid是自动增长的,值唯一的。level的值一般是1-5之间的数字。我想要的第一步的结果是选出 tid最大的10条数据。然后再不打乱原有排序的情况下。再次更具level用类似于程序中冒泡法那样更具level排序。最后再次更具表2中的记录再做一次排序。排序方法也是在level中那样。保持原来排序规则不变的情况下。如果表2中有对应id和userid的情况下就把数据排到前面来。简单的说。这10条数据的排序优先级如下:
    表2中有匹配项的。则更具表2中的id排序,但只排匹配的项。如:表2中有一条匹配的。是对应结果的第8条数据。那么就仅仅把第八条数据放在第一位。其他的不变。
    这个排序完成之后 在更具level排序。把leve最大的排在前面。当然这个排序排除表2中已经排序的内容。
    最后一个排序。由于level只有1-5之间的数字。所以必定有重复的。那么再次更具tid的大小来排序。。
      

  4.   

    Hopewell_Go 你好。我不是想更具表2中的记录选择表1的内容并且排序。我的意思是表2作为一个排序的规则。是先读取表1中的记录。然后更具表1本身的一些内容和表2的内容来进行排序。
      

  5.   

    如:
    表1  tid  name level
          1    x1   4
          2    x2   3
          3    x3   4
          4    x4   5
          5    x5   1
          6    x6   3
          7    x7   3
          8    x8   4
          9    x9   2
          10   x10  5
    表2 id  tid  userid
         1  7     1
         2  5     1
         3  1     1
         
         
    以要得到top 9数据为例。
    要得到的结果以及排序
    应为表2中有第5条数据。并且表2的id中匹配的最前,因为这里只选9条。所以表2的第三条tid为1无效,否则应该tid为1的最前
    5    x5   1虽level和tid值小。但表2中有对应记录。且id较大
    7    x7   3虽level和tid值小。但表2中有对应记录。id其次
    10   x10  5  level相同,则用tid排序
    4    x4   5
    8    x8   4  level相同,则用tid排序
    3    x3   4
    6    x6   3  level相同,则用tid排序
    2    x2   3 
    9    x9   2
      

  6.   

    ----创建测试数据
    declare @t1 table(tid int,name varchar(10),level int)
    declare @t2 table(id int,tid int,userid int)
    insert @t1
    select 1,    'x1',   4 union all
    select 2,    'x2',   3 union all
    select 3,    'x3',   4 union all
    select 4,    'x4',   5 union all
    select 5,    'x5',   1 union all
    select 6,    'x6',   3 union all
    select 7,    'x7',   3 union all
    select 8,    'x8',   4 union all
    select 9,    'x9',   2 union all
    select 10,   'x10',  5
    insert @t2
    select 1, 7,     1 union all
    select 2, 5,     1 union all
    select 3, 1,     1----排序
    select a.* from 
    (select top 9 * from @t1 order by tid desc) as a
    left join @t2 as b on a.tid = b.tid
    order by case when b.tid is not null then b.id else 0 end desc,
    a.level desc,a.tid desc
         
    /*结果
    tid    name    level
    ----------------------------------------------
    5      x5       1
    7      x7       3
    10     x10      5
    4      x4       5
    8      x8       4
    3      x3       4
    6      x6       3
    2      x2       3
    9      x9       2
    */
      

  7.   

    请问您sql 玩了多久了??我不知道要猴年马月才能更上来了。。以前一直不重视数据库。一直在学语言。。现在真后悔啊。