MYSQL LEFT JOIN ON RELATED TABLE

时间:2015-12-27 11:59:59

标签: mysql sql date max

我有4个表和一个几乎返回我想要的SQL。它包含相关表和中间表的最大日期。最后一个问题得到了回答,但我意识到我需要更多的sql,如果id_aluno外键的相关表中没有记录,则返回null。

table: Aluno
id_aluno    nome
1           Bruno
2           Carlos
3           Fernando

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
Fernando    null         null          null

但是下面的SQL并没有给我一个" aluno" (a.nome)如果没有关于相关表的数据。我试过LEFT JOIN,但这不是我想要的方式。

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
     ) 

我希望你能提供帮助。谢谢

2 个答案:

答案 0 :(得分:1)

尝试这样的事情

SELECT nome, 
       descricao, 
       data, 
       data_avaliacao 
FROM   aluno A 
       LEFT OUTER JOIN serie S 
                    ON A.id_aluno = S.id_aluno 
       LEFT OUTER JOIN (SELECT s.id_aluno, 
                               Max(t.data) data 
                        FROM   serie s 
                               JOIN treino t 
                                 ON t.id_serie = s.id_serie 
                        GROUP  BY id_aluno) T 
                    ON T.id_aluno = A.id_aluno 
       LEFT OUTER JOIN (SELECT Max(v.data_avaliacao) data_avaliacao,
                               id_aluno 
                        FROM   avaliacao v 
                        GROUP  BY id_aluno) V
                    ON v.id_aluno = A.id_aluno 

答案 1 :(得分:0)

我明白了!

SELECT nome, T.descricao, T.data, data_avaliacao  
FROM   aluno A 
LEFT OUTER JOIN (SELECT s.id_aluno, s.descricao, max(t.data) data 
            FROM serie s 
            JOIN treino t ON t.id_serie = s.id_serie 
            GROUP BY id_aluno) T ON T.id_aluno = A.id_aluno AND A.id_aluno = T.id_aluno 
LEFT OUTER JOIN (SELECT max(v.data_avaliacao) data_avaliacao, id_aluno 
            FROM   avaliacao_aluno v 
            GROUP  BY id_aluno) V ON v.id_aluno = A.id_aluno