3

我有两个表 - 我们将调用它们grade并且test- 通过第三个表上的键相关的信息,我们将调用它student

如果test包含列student_id、、test_topictest_date,并且grade包含列student_id、、gradeentered_date,我希望能够查看grade表中的记录,并基于student_identered_date,仅将其与日期最近的记录相关teststudent_id

我当前的查询似乎返回与所有以前的测试相关的每个等级,而不仅仅是最近的一个。我不知道如何限制它,以便它显示每个等级仅与输入等级时的最新测试相匹配。

我认为我解释得不是很好,所以我用示例模式、一些测试数据和我当前的查询设置了一个 SQL Fiddle:http: //sqlfiddle.com/#!2/ b5233 /5

ETA:澄清一下:我希望查询报告每次考试的成绩,这是通过输入成绩时最近参加的考试推断出来的。我在这里添加了一个新的变体小提琴:http://sqlfiddle.com/#!2/b5233/43 其中包含一个包含测试主题的查询,我认为这使问题更加清晰。对于 'Adam' (student_id = 1),期望的结果是:

STUDENT_ID                 TEST_DATE                       TEST_TOPIC                      GRADE_TIME                TEST_GRADE
     1          October, 02 2013 23:08:24+0000          Medieval History          October, 02 2013 23:08:25+0000          A
     1          October, 02 2013 23:08:30+0000          Calculus                  October, 02 2013 23:08:32+0000          C
     1          October, 02 2013 23:08:43+0000          Biochemistry              October, 02 2013 23:08:44+0000          A
     1          October, 02 2013 23:08:49+0000          Advanced German           October, 02 2013 23:08:50+0000          C

但目前你会看到它返回的是成绩表中的每个成绩与之前进行的所有测试相匹配,而不仅仅是最近的。

4

2 回答 2

2

我认为你应该在你的成绩表中有一个 test_id 外键,这样你就不必尝试加入一个复杂的日期值,这会导致你出现问题(即,如果学生在给定日期参加多个测试怎么办? )。

这将为您提供一种直接将成绩与特定学生的考试相关联的方法。

于 2013-10-02T23:48:54.963 回答
0

架构已关闭 - 正如您可能已经知道的那样。应该有一种方法可以将成绩与测试 ID 直接关联起来。否则,这样的事情会起作用(尽管我认为数据库太重并且表上的行数很多时性能不佳)。

SELECT
  S.student_id,
  S.student_name AS Student,
  T.test_topic AS Topic,
  G.grade AS Grade,
  T.test_date AS `Test Date`,
  G.entered_date AS `Grade Time (debug)`
FROM
  student S, test T, grade G
WHERE
  S.student_id = G.student_id
  AND S.student_id = T.student_id
  AND G.entered_date > T.test_date
  AND T.test_date = 
  (
    SELECT MAX(T2.test_date)
    FROM test T2
    WHERE T2.student_id = T.student_id
    AND T2.test_topic = T.test_topic
  )
  AND 
  (
    G.entered_date < 
      (
        SELECT MIN(T3.test_date)
        FROM test T3
        WHERE T3.student_id = T.student_id
        AND T3.test_topic <> T.test_topic
        AND T3.test_date > T.test_date
      )
    OR NOT EXISTS
      (
        SELECT 1
        FROM test T4
        WHERE T4.student_id = T.student_id
        AND T4.test_topic <> T.test_topic
        AND T4.test_date > T.test_date
      )
   )
ORDER BY S.student_id, T.test_date, G.entered_date

上面的查询获取一个主题和学生的最新测试,然后继续将找到的行与该学生的成绩匹配,该学生的最高成绩entered_date 低于下一次测试的时间,或者找不到以后的测试日期

在这里,有一个小提琴:http ://sqlfiddle.com/#!2/7c069f/9/0

于 2013-10-02T23:57:35.577 回答