表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的值越大。排序就越前面。
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的值越大。排序就越前面。
解决方案 »
- 求助一个表的设计(看看怎么处理)
- SQL语句操作,应该对高手简单的
- 求一sql语句 请高手指点 在线等....
- 请问一条操作表语句,谢谢高手了
- 这样的sql语句应该如何写了!请教大家(关键字的搜索)
- sqlserver 2008R2 数据库收缩文件打不开对话框
- sql 语句的查询问题,急
- 还是查询问题!要用存储过程!
- 十萬火急﹕如何在存儲過程中執行另一個存儲過程﹐并用游標打開這個過程所得到的記錄集﹖
- 初学者问:我在sql*plus workssheet里用delete删除一表所有行,执行后提示删除所有行成功,可是我第二次开启sql*plus workssheet时执行select后发现刚才的那张表记录并没被删除,这是为何?
- 小弟今天求职,被问得两道SQL,作的郁闷。贴出来虚心求教
- 老是出现这样的错误,怎么改
(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
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
连续的两个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的大小来排序。。
表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
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
*/