我有两个表格 - 我们称之为grade
和test
- 通过第三个表格上的密钥相关的信息,我们称之为{{1 }}
如果student
包含test
列,student_id
和test_topic
,test_date
包含grade
列,student_id
,和grade
,我希望能够查看entered_date
表中的记录,并根据grade
和student_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
但目前您会看到它所回馈的内容是,成绩表中的每个成绩与之前采用的所有测试相匹配,而不是仅与最近的测试相匹配。
答案 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