获得问题的最后答案ID

时间:2011-09-28 06:52:26

标签: sql-server database-table

在M.C.Q测试中,当用户再次回到同一问题时,我如何追踪问题的最后答案?,

以下是表格结构

Method: 1    
temptblUserAnswer
    id   uid   qid   ansid
    1    1     1     5
    2    1     2     6

我应该更新该特定问题的表值吗?是或者我应该使用以下表结构吗?

Method: 2    
temptblUserAnswer
    id   uid   qid   ansid   timestamp
    1    1     1     5       2011-09-28 11:54:32
    2    1     2     12      2011-09-28 11:58:40
    3    1     1     7       2011-09-28 12:02:50

在时间戳的帮助下,我可以找到任何特定问题的最后答案。

现在的问题是,应遵循哪种方法,哪种方法将以绩效为导向? 或者对此更好的建议?我应该使用Method:1并在uid,ansid列上应用索引吗?

2 个答案:

答案 0 :(得分:2)

如果您的ID是自动增量,则可以根据Id:

获得最后一个答案
SELECT TOP 1 AnsID
WHERE Uid=@UserId AND Qid=@QuestionID
ORDER BY Id DESC

关于性能:您应该将非聚集索引放在Uid AND Qid AND ID和Include AnsID上

您可以避免在此表中使用timestamp列。

答案 1 :(得分:0)

1:对于第一种方法:

要获取给定问题ID的最后一个答案ID,您可以使用此脚本:

   --index creation
   CREATE UNIQUE INDEX IUN_temptblUserAnswer_qid_id ON temptblUserAnswer(uid,qid,id DESC);

   --query
    DECLARE @QuestionID INT, @UserID INT;
    SELECT @QuestionID=123, @UserID = 456;

    SELECT TOP 1 ansid
    FROM temptblUserAnswer
    WHERE qid = @QuestionID
    AND uid = @UserID
    ORDER BY id DESC;

在这种情况下,我假设最后一个答案是由最后一个temptblUserAnswer.id给出的。我还假设temptblUserAnswer.idIDENTITY(1,1)。 问题:如果某人在temptblUserAnswer表上运行ad-hoc插入,则可能会得到错误的结果。

2:对于第二种方法:

您应该使用具有更高精度的日期/时间数据类型(对于SQL版本< = SQL2005:DATETIME是唯一的选项,对于SQL版本> SQL2005,您可以使用DATETIME2(7)数据类型和SYSDATETIME()函数而不是GETDATE()/ CURRENT_TIMESTAMP函数)。即便如此,您可以使用相同的timestamp获得两个或更多答案。在这种情况下,您可以使用'temptblUserAnswer.id'列作为第二个条件。

   --index creation
   CREATE UNIQUE INDEX IUN_temptblUserAnswer_qid_id ON temptblUserAnswer(uid,qid,timestamp DESC, id DESC);

   --query
    DECLARE @QuestionID INT, @UserID INT;
    SELECT @QuestionID=123, @UserID = 456;

    SELECT TOP 1 ansid
    FROM temptblUserAnswer
    WHERE qid = @QuestionID
    AND uid = @UserID
    ORDER BY timestamp DESC, id DESC;