MAX DATE带中间表

时间:2015-12-22 17:17:17

标签: mysql date max

我无法得到正确的结果。我有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”列,但它不是具有日期的表的外键。他们之间有一个中间表(系列)。 我还有另一张桌子(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 )

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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

中测试一下

答案 2 :(得分: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
     ) 

,希望这个帮助