62,243
社区成员




CREATE TABLE student
(id INT IDENTITY(1,1),Name VARCHAR(20) NOT NULL,ClassID INT NOT NULL,hasVoted BIT NOT NULL DEFAULT 0)
CREATE TABLE school
(id INT IDENTITY(1,1),Name VARCHAR(50) NOT NULL)
CREATE TABLE class
(id INT IDENTITY(1,1),schoolID INT NOT NULL,ClassName VARCHAR(20) NOT NULL)
/*若无必要,则可将 school 与 class 合二为一, 唯一健,也即标识用class.id来表示,school.Name从属于class的列*/
CREATE TABLE vote
(id INT IDENTITY(1,1),classID INT NOT NULL,teacher VARCHAR(20) NOT NULL,subject VARCHAR(10) NOT NULL,voteNum INT NOT NULL DEFAULT 0,degree DECIMAL(10,2) DEFAULT 100)
CREATE TABLE vote_item
(id INT IDENTITY(1,1),studentID INT NOT NULL,voteID INT NOT NULL,degree DECIMAL(10,2))
/*(引用lz原话"这个表有十条,每条四个选项10分,8分,6分,4分")
这些东西,你可以建表,或用xml存,或在前台html页写死. 最后用程序取得一个学生对一个老师的满意度存为vote_item.degree
如果用html页写死,注意程序检测提交的数据是否合法
*/
--student login. 需不要要加密码,你自己确定
DECLARE @id INT,@Name VARCHAR(20),@classID INT
SELECT @id=id,@Name=Name,@classID=classID FROM student WHERE Name=@loginName AND hasVoted=0 -- AND Password=@loginPassword
--这里我将id,name存放@id,@Name,@classID即指代,student login后它的session中的id和name,以后可以传给sqlString或SqlParameters
--能否对某个老师进行投票, @teacherid 为页面传入参数,即点对某个老师进行投票时,传入,也即对应的 vote.id
IF EXISTS(SELECT 1 FROM vote_item WHERE @teacherid=voteID AND @id=stuedntID)
--不能投票,给出提示
PRINT '已经投过票了'
ELSE
--需要检则@classID是否是当前选中的老师的classID,略去
--对这个老师进行投票,并算出单个degree,值为 @degree
--插入单个degree记录
INSERT vote_item SELECT @id,@teacherid,@degree
--更新teacher的总degree,即更新vote.degree
UPDATE a SET degree=degreeAVG
FROM vote a
INNER JOIN (
SELECT voteID,AVG(degree) degreeAVG
FROM vote_item
GROUP BY voteID
) b
ON a.voteID=b.voteID
--若学生已给其classid所有老师投过票
IF NOT EXISTS(SELECT 1 FROM vote a WHERE classID=@classid
AND NOT EXISTS(SELECT 1 FROM vote_item WHERE @id=studentID AND voteID=a.voteID)
)
--上面这条语句写的有点烦索.
/*可换用
IF (SELECT COUNT(*) FROM vote WHERE classid=@classid) != (SELECT COUNT(*) FROM vote_item WHERE studentid=@id)
若系统数据处理的严谨程度不高,或并发处理不完善,且勿用此句
*/
--更新student.hasVoted为1
UPDATE student SET hasVoted=1 WHERE id=@id
END