1: Для первого метода:
Чтобы получить идентификатор последнего ответа для данного идентификатора вопроса, вы можете использовать этот скрипт:
--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.id
это IDENTITY(1,1)
.Проблема: если кто-то запускает специальную вставку в таблицу temptblUserAnswer
, это может привести к неверным результатам.
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;