2015-12-22 69 views
0

我無法獲得正確的結果。我有4個表:MAX日期與中間表

table: Aluno 
id_aluno nome 
1   Bruno 
2   Carlos 

table: Serie 
id_serie id_aluno descricao 
1   1   Tipo A 
2   1   Tipo B 
3   2   Tipo A 

table: Treino 
id_treino id_serie data 
1   1   2015-12-10 
2   2   2015-12-12 
3   3   2015-12-10 

table: Avaliacao 
id_avaliacao id_aluno data_avaliacao 
1    1   2015-12-07 
2    1   2015-12-01 
3    2   2015-12-05 
4    2   2015-12-04 

我想要的結果如下:

nome  descricao data   data_avaliacao 
Bruno TIPO B  2015-12-12 2015-12-07 
Carlos TIPO A  2015-12-10 2015-12-05 

的問題是,在GROUP BY子句中應該有列「id_aluno」,但它不是它有表的外鍵日期。他們之間有一箇中間表(serie)。 我還有另一張桌子(avaliacao),我也想要max DATE,但是當我加入他們的時候,我得到了aluno的不止一個結果。

查詢我想:

SELECT a.nome, s.descricao, t.data, aa.data_avaliacao FROM Aluno a JOIN Serie s ON s.id_aluno = a.id_aluno JOIN Treino t ON t.id_serie = s.id_serie JOIN Avaliacao aa ON aa.id_aluno = a.id_aluno WHERE t.data = SELECT MAX(t1.data) FROM Aluno a1 JOIN Serie s1 ON s1.id_aluno = a1.id_aluno JOIN Treino t1 ON t1.id_serie = s1.id_serie WHERE s1.id_aluno = s.id_aluno) 
+3

那你試試? – Strawberry

+0

SELECT a.nome, s.descricao, t.data,aa.data_avaliacao FROM Aluno一個 JOIN意甲小號 ON s.id_aluno = a.id_aluno JOIN Treino噸 ON t.id_serie = s.id_serie JOIN Avaliacao AA ON aa.id_aluno = a.id_aluno WHERE t.data = SELECT MAX(t1.data) FROM Aluno A1 JOIN甲級S1 ON s1.id_aluno = a1.id_aluno JOIN Treino T1 在T1 .id_serie = s1.id_serie WHERE s1.id_aluno = s.id_aluno ) –

+0

請相應編輯您的問題。 – Strawberry

回答

0

如果我給你這個,你可以工作,另一部分?

SELECT a.nome 
    , s.descricao 
    , t.data 
    , v.data_avaliacao 
    FROM aluno a 
    JOIN serie s 
    ON s.id_aluno = a.id_aluno 
    JOIN treino t 
    ON t.id_serie = s.id_serie 
    JOIN 
    (SELECT s.id_aluno 
      , MAX(t.data) max_data 
     FROM serie s 
     JOIN treino t 
      ON t.id_serie = s.id_serie 
     GROUP 
      BY id_aluno 
    ) x 
    ON x.id_aluno = s.id_aluno 
    AND x.max_data = t.data 
    JOIN avaliacao v 
    ON v.id_aluno = a.id_aluno; 
0

與自己的查詢工作檢查的最後一部分,通過

SELECT a.nome, s.descricao, t.data, aa.data_avaliacao FROM Aluno a 
JOIN Serie s ON s.id_aluno = a.id_aluno 
JOIN Treino t ON t.id_serie = s.id_serie 
JOIN Avaliacao aa ON aa.id_aluno = a.id_aluno 

WHERE t.data = 

(SELECT MAX(t1.data) 
FROM Aluno a1 
JOIN Serie s1 ON s1.id_aluno = a1.id_aluno 
JOIN Treino t1 ON t1.id_serie = s1.id_serie 
WHERE s1.id_aluno = s.id_aluno) group by a.nome 

只加入該團體,您可以在sqlfiddle

+0

這幾乎是我想要的,但它並沒有給我帶來avaliacao的最大日期。 –

0

測試一下我認爲davejal的代碼只能如果在數據中表格treino的MAX日期對應於每個aluno的表格avaliacao的MAX日期,那麼當不一樣時,結果不會是預期的。使用的

草莓

的想法,最終將

SELECT a.nome 
    , s.descricao 
    , t.data 
    , v.data_avaliacao 
    FROM aluno a 
    JOIN serie s 
    ON s.id_aluno = a.id_aluno 
    JOIN treino t 
    ON t.id_serie = s.id_serie 
    JOIN 
    (SELECT s.id_aluno 
      , MAX(t.data) max_data 
     FROM serie s 
     JOIN treino t 
      ON t.id_serie = s.id_serie 
     GROUP 
      BY id_aluno 
    ) x 
    ON x.id_aluno = s.id_aluno 
    AND x.max_data = t.data 
JOIN avaliacao v 
     ON s.id_aluno = v.id_aluno 
WHERE v.data_avaliacao IN 
    (SELECT MAX(v.data_avaliacao) max_data1 
       FROM avaliacao v 
     GROUP 
      BY id_aluno 
    ) 

,希望這有助於

+0

完美!非常感謝你!!! –