带中间表格的最大日期



我无法得到正确的结果。我有4张桌子:

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),我也想要最大日期,但当我加入所有表时,我得到了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 )

如果我给你这个,你能算出另一部分吗?

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;

使用自己的查询检查最后一部分,通过只添加组

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 中进行测试

我认为,davejal的代码只有在数据中treino表的MAX日期与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
     ) 

,希望这能帮助

最新更新