如何使用SQL执行此搜索?

时间:2019-01-24 23:01:40

标签: sql

我有三个带有以下(相关)列的表:

  • 问题:级别,answer_id
  • 选择:question_id,answer_id,user_id,date_answered
  • 用户:ID,级别

向用户显示问题,当他们通过选择可用的答案之一来回答问题时,这将创建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查询,或者我必须在编程内使用循环?

1 个答案:

答案 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)