怎样确定选题结果?
学生选题表(sdu_id,ques_id ,指标1,指标2),每个学生选择多到题。
教师出题表(ques_id,tea_id)每个教师出多道题。
教师限制表(tea_id,max)该教师最多指导学生做题数。
要求:
对于选题表先根据指标1,2降序排列。选择该同学指标1,2尽量靠前(因为还要满足该出题教师指导学生的限制)的1道题。还要保证一道题只能由1个同学选择!
我理解的执行过程:
首先根据对选题表按指标1,2排序。
然后逐行查看每条选题记录:
(1).看该同学是否已经确定出一道题 ,“是” 取下一条记录,“否” 检查(2)
(2).看该题是否已经被一个同学选择,“是” 取下一条记录,“否” 检查(3)
(3).再检查该出题教师指导学生是否达到限制,“是”取下一条,“否” 这该题由当前同学做!
结果 确定出每一个同学选择的题,有可能有的同学不能选到题。
结果可以是另外一张表,也可以加一个字段flag标识。 假设像如下的数据:
教师限制表:
tea_id max
t1001 2
t1005 2
t1006 1
……
教师出题表:每个教师给出3道题供学生选择
ques_id tea_id
q1001 t1001
q1002 t1001
q1003 t1005
q1004 t1006
q1005 t1001
q1006 t1005
q1007 t1005
q1008 t1006
q1009 t1006
……
学生选题表:根据指标1,2排好序
stu_id ques_id 指标1 指标2
s1002 q1005 99 95
s1003 q1001 99 93
s1001 q1001 95 92
s1003 q1006 94 90
s1004 q1002 92 90
……上面记录:
s1002 q1005 99 95 --(1),(2),(3)都满足,则确定他选本题
s1003 q1001 99 93 --(1),(2),(3)都满足,则确定他选本题
s1001 q1001 95 92 --(2)不满足,取下一条
s1003 q1006 94 90 --(1)不满足,取下一条
s1004 q1002 92 90 --(3)不满足,取下一条
……
怎么来实现,各位有什么好的办法?
学生选题表(sdu_id,ques_id ,指标1,指标2),每个学生选择多到题。
教师出题表(ques_id,tea_id)每个教师出多道题。
教师限制表(tea_id,max)该教师最多指导学生做题数。
要求:
对于选题表先根据指标1,2降序排列。选择该同学指标1,2尽量靠前(因为还要满足该出题教师指导学生的限制)的1道题。还要保证一道题只能由1个同学选择!
我理解的执行过程:
首先根据对选题表按指标1,2排序。
然后逐行查看每条选题记录:
(1).看该同学是否已经确定出一道题 ,“是” 取下一条记录,“否” 检查(2)
(2).看该题是否已经被一个同学选择,“是” 取下一条记录,“否” 检查(3)
(3).再检查该出题教师指导学生是否达到限制,“是”取下一条,“否” 这该题由当前同学做!
结果 确定出每一个同学选择的题,有可能有的同学不能选到题。
结果可以是另外一张表,也可以加一个字段flag标识。 假设像如下的数据:
教师限制表:
tea_id max
t1001 2
t1005 2
t1006 1
……
教师出题表:每个教师给出3道题供学生选择
ques_id tea_id
q1001 t1001
q1002 t1001
q1003 t1005
q1004 t1006
q1005 t1001
q1006 t1005
q1007 t1005
q1008 t1006
q1009 t1006
……
学生选题表:根据指标1,2排好序
stu_id ques_id 指标1 指标2
s1002 q1005 99 95
s1003 q1001 99 93
s1001 q1001 95 92
s1003 q1006 94 90
s1004 q1002 92 90
……上面记录:
s1002 q1005 99 95 --(1),(2),(3)都满足,则确定他选本题
s1003 q1001 99 93 --(1),(2),(3)都满足,则确定他选本题
s1001 q1001 95 92 --(2)不满足,取下一条
s1003 q1006 94 90 --(1)不满足,取下一条
s1004 q1002 92 90 --(3)不满足,取下一条
……
怎么来实现,各位有什么好的办法?
select a1.* from #as a1 where idd =(select min(idd) from #as a2 where a1.ques_id=a2.ques_id)--不满足
select a1.* from #as a1 where idd <(select min(idd) from #as a2 where a1.ques_id=a2.ques_id)
GO
CREATE TABLE TeaMax(TEA_ID VARCHAR(10),NUM int)
INSERT INTO TeaMax SELECT 't1001',2
UNION ALL SELECT 't1005',2
UNION ALL SELECT 't1006',1IF OBJECT_ID('QueTea') IS NOT NULL DROP TABLE QueTea
GO
CREATE TABLE QueTea(Ques_ID VARCHAR(10),Tea_id VARCHAR(10))
INSERT INTO QueTea SELECT 'q1001','t1001'
UNION ALL SELECT 'q1002','t1001'
UNION ALL SELECT 'q1003','t1005'
UNION ALL SELECT 'q1004','t1006'
UNION ALL SELECT 'q1005','t1001'
UNION ALL SELECT 'q1006','t1005'
UNION ALL SELECT 'q1007','t1005'
UNION ALL SELECT 'q1008','t1006'
UNION ALL SELECT 'q1009','t1006'IF OBJECT_ID('StuQue') IS NOT NULL DROP TABLE StuQue
GO
CREATE TABLE StuQue(Stu_ID VARCHAR(10),Ques_ID VARCHAR(10),CHECK1 INT,CHECK2 INT)
INSERT INTO StuQue SELECT 's1002','q1005',99,95
UNION ALL SELECT 's1003','q1001',99,93
UNION ALL SELECT 's1001','q1001',95,92
UNION ALL SELECT 's1003','q1006',94,90
UNION ALL SELECT 's1004','q1002',92,90IF OBJECT_ID('TEMPDB.DBO.#T') IS NOT NULL DROP TABLE #T
GO
SELECT * ,IDNO=IDENTITY(INT,1,1)INTO #T FROM StuQue
IF OBJECT_ID('TEMPDB.DBO.#TB') IS NOT NULL DROP TABLE #TB
GO
SELECT A.*,B.NUM INTO #TB FROM
(SELECT A.*,B.Tea_id FROM #T A
INNER JOIN QueTea B
ON A.Ques_ID=B.Ques_ID
WHERE NOT EXISTS(SELECT 1 FROM #T WHERE Stu_ID=A.Stu_ID AND CHECK1>A.CHECK1 ))A
INNER JOIN TeaMax B
ON A.Tea_id=B.Tea_id
ORDER BY IDNO
SELECT A.Stu_ID,A.Ques_ID,A.CHECK1,A.CHECK2 FROM #TB A
WHERE (SELECT COUNT(1) FROM #TB WHERE Tea_id=A.Tea_id AND IDNO<=A.IDNO )<=A.NUM
ORDER BY IDNO
--满足的结果
/*Stu_ID Ques_ID CHECK1 CHECK2
---------- ---------- ----------- -----------
s1002 q1005 99 95
s1003 q1001 99 93(所影响的行数为 2 行)
*/
IF OBJECT_ID('TEMPDB.DBO.#T') IS NOT NULL DROP TABLE #T
GO
SELECT * ,IDNO=IDENTITY(INT,1,1)INTO #T FROM StuQueIF OBJECT_ID('TEMPDB.DBO.#TB') IS NOT NULL DROP TABLE #TB
GO
SELECT A.*,B.NUM INTO #TB FROM
( SELECT A.*,B.Tea_id FROM #T A
INNER JOIN QueTea B ON A.Ques_ID=B.Ques_ID
WHERE NOT EXISTS(SELECT 1 FROM #T WHERE Stu_ID=A.Stu_ID AND idno<A.idno )--1处
and NOT EXISTS(SELECT 1 FROM #T WHERE Ques_ID=A.Ques_ID AND idno<A.idno )--2处
)A INNER JOIN TeaMax B ON A.Tea_id=B.Tea_id
ORDER BY IDNOSELECT A.Stu_ID,A.Ques_ID,A.CHECK1,A.CHECK2 FROM #TB A
WHERE (SELECT COUNT(1) FROM #TB WHERE Tea_id=A.Tea_id AND IDNO<=A.IDNO )<=A.NUM
ORDER BY IDNO
--原因:用CHECK1不甚严密,既然有了idno直接用它好了(idno<A.idno )
--2处:漏了“还要保证一道题只能由1个同学选择!”这个条件,这里的数据是老师刚好是两道,如果是3道就会出现同一道题被两个人选的现象。(and NOT EXISTS(SELECT 1 FROM #T WHERE Ques_ID=A.Ques_ID AND idno<A.idno ))
到最后就取出,过虑老师最大限制的学生数 :WHERE (SELECT COUNT(1) FROM #TB WHERE Tea_id=A.Tea_id AND IDNO <=A.IDNO ) <=A.NUM
wgzaaa这个仁兄,不知道我这样的理解是否正确