我有三个带有以下(相关)列的表:
向用户显示问题,当他们通过选择可用的答案之一来回答问题时,这将创建choices
记录并为answer_id
分配适当的值。用户可以多次回答问题。
我需要一个查询,该查询将告诉我,仅考虑每个已回答问题的最新选择以及正确回答的数量。我知道有足够多的SQL危险,但这是我的头了。
例如:
问题
id level answer_id
------------------
1 1 101
2 1 102
3 1 103
4 2 110
选择
question_id answer_id user_id date_answered
--------------------------------------------
1 101 201 2019-01-24
1 104 201 2019-01-25
2 105 201 2019-01-25
2 102 201 2019-01-26
3 103 201 2019-01-26
因此,用户201正确回答了第一个问题,然后回答不正确。然后他们错误地然后正确地回答了第二个问题。最后,他们回答了问题3一次,这是正确的。
请注意,所有这些均在问题级别内。如果用户的级别为1,那么我只会考虑选择级别1的问题。如果是2级,则只能选择2级问题。
尽管他们已经正确回答了所有1级问题,但他们最近一次只正确回答了1级两次。因此,2是我要寻找的结果。
是否存在可以执行此操作的SQL查询,或者我必须在编程内使用循环?
答案 0 :(得分:1)
我目前没有安装SQL Server,因此答案中可能有一些错字。仅当这是该用户的最新答案时,这才可以使您正确回答问题。
SELECT *
FROM
questions a INNER JOIN
choices b on (a.question_id = b.question_id) INNER JOIN
( SELECT question_id, user_id, max(date_answered) as date_answered
FROM choices
GROUP BY question_id, user_id
) c
on (b.question_id = c.question_id and b.user_id = c.user_id and b.date_answered = c.date_answered)
回答更新的问题:
SELECT *
FROM
questions a INNER JOIN
choices b on (a.id = b.question_id) INNER JOIN
( SELECT question_id, user_id, max(date_answered) as date_answered
FROM choices
GROUP BY question_id, user_id
) c INNER JOIN
on (b.question_id = c.question_id and b.user_id = c.user_id and b.date_answered = c.date_answered) INNER JOIN
users d on (d.id = b.user_id and d.level = a.level)