2015-12-22 47 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

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