在MySQL中根据日期选择记录

时间:2013-10-02 23:42:43

标签: mysql join comparison timestamp

我有两个表格 - 我们称之为gradetest - 通过第三个表格上的密钥相关的信息,我们称之为{{1 }}

如果student包含test列,student_idtest_topictest_date包含grade列,student_id,和grade,我希望能够查看entered_date表中的记录,并根据gradestudent_id将其与entered_date中的记录相关联{1}}具有相同日期最近的test

我当前的查询似乎返回与所有以前的测试相关联的每个等级,而不是仅返回最新的等级。我无法弄清楚如何限制它,以便它显示每个等级只与进入等级时的最新测试相匹配。

我认为我没有很好地解释这一点,所以我在这里设置了一个带有示例模式,一些测试数据和我当前查询的SQL Fiddle:http://sqlfiddle.com/#!2/b5233/5

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

student_id

但目前您会看到它所回馈的内容是,成绩表中的每个成绩与之前采用的所有测试相匹配,而不是仅与最近的测试相匹配。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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 低于下一个测试&#39;时间,无法找到以后的测试日期

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