2013-10-02 177 views
3

我有兩個表 - 我們將其稱爲gradetest - 通過第三個表上的關鍵字相關的信息,我們將其稱爲student在MySQL中根據日期選擇記錄

如果test包含test_topicstudent_id,和test_dategrade包含列student_idgradeentered_date,我希望能夠看到一個記錄在grade表的基礎上,student_identered_date,副教授它僅與test中的記錄相同,其日期最近爲student_id

我目前的查詢似乎會返回與所有以前的測試相關的每個年級,而不僅僅是最近的一次。我無法弄清楚如何限制它,以便顯示每個等級只與進入等級時最近的測試相匹配。

我不認爲我已經解釋了這個非常好,所以我給自己定了一個SQL撥弄示例模式,一些測試數據,以及我的當前查詢的位置:http://sqlfiddle.com/#!2/b5233/5

ETA:澄清:我希望查詢報告的等級爲,每個測試都是通過最近進入等級時進行的測試推導的。我在這裏添加了一個新的變體小提琴:http://sqlfiddle.com/#!2/b5233/43,其中包含測試主題,我認爲這個問題會讓問題更清楚一些。對於「亞當」(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 

,但目前你會看到什麼還給是打擊匹配等級表中的每個年級之前,與其採取一切測試只有最近的。

+0

你試過GROUP BY student_id嗎? – Gustavo

+0

我有,但我承認我無法理解GROUP BY的工作原理。最終,它似乎只爲給定的學生返回一個記錄,而不是爲每次測試返回一個記錄。 – Valentine

+0

你是否試圖通過考試,每個學生(或一名學生,因爲你已經限制了小提琴)獲得所有最新成績? – leon

回答

2

我認爲你應該在你的成績表中有一個test_id外鍵,這樣你就不必嘗試加入會導致你問題的複雜日期值(例如,如果學生需要多個測試在給定的日期)。

這會給你一個手段,直接關係到特定學生的考試成績。

+0

我在想同一件事 –

+0

這個例子的弱點部分是我試圖讓它比我真正想解決的問題更通用,唉。在任何情況下,儘管我意識到這將是理想的,但在等級表中製作test_id FK的模式更改不是一種選擇。 – Valentine

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比下一次測試的時間 OR 較低的匹配其中不遲可以發現測試日期

在這裏,有一個小提琴:http://sqlfiddle.com/#!2/7c069f/9/0