SQL with empty join

1

I need to do this query with MySQL returning according to year.

But for those with no working hours, the field must be NULL

For example: year 2017

SELECT
    'turmas_has_estudantes'.'id',
    'turmas_has_estudantes'.'numero',
        'estudantes_identificacao'.'nome_completo',
        'estudantes_carga_horaria'.'dias_letivos_anuais',
        'estudantes_carga_horaria'.'ch_diaria',
        'estudantes_carga_horaria'.'ano_letivo'
    FROM
        'turmas_has_estudantes'
    LEFT JOIN 'estudantes_identificacao' ON 'estudantes_identificacao'.'id' = 'turmas_has_estudantes'.'estudantes_identificacao_id'
    LEFT JOIN 'estudantes_carga_horaria' ON 'estudantes_carga_horaria'.'estudantes_identificacao_id' = 'turmas_has_estudantes'.'estudantes_identificacao_id'
    WHERE
        'turmas_has_estudantes'.'turmas_id' = 535 AND         'estudantes_carga_horaria'.'ano_letivo' = 2017 OR         'estudantes_carga_horaria'.'ano_letivo' IS NULL
    ORDER BY
        'turmas_has_estudantes'.'numero' ASC,
'estudantes_identificacao'.'nome_completo' ASC
    
asked by anonymous 25.06.2018 / 16:39

1 answer

4

When you use LEFT JOIN but put conditions in the related table in WHERE , the join may end up behaving like INNER . Here's how:

SELECT
    'turmas_has_estudantes'.'id',
    'turmas_has_estudantes'.'numero',
    'estudantes_identificacao'.'nome_completo',
    'estudantes_carga_horaria'.'dias_letivos_anuais',
    'estudantes_carga_horaria'.'ch_diaria',
    'estudantes_carga_horaria'.'ano_letivo'
FROM 'turmas_has_estudantes'
    LEFT JOIN 'estudantes_identificacao' 
    ON 'estudantes_identificacao'.'id' = 'turmas_has_estudantes'.'estudantes_identificacao_id'

    LEFT JOIN 'estudantes_carga_horaria' 
    ON 'estudantes_carga_horaria'.'estudantes_identificacao_id' = 'turmas_has_estudantes'.'estudantes_identificacao_id'
        AND ('estudantes_carga_horaria'.'ano_letivo' = 2017 OR 'estudantes_carga_horaria'.'ano_letivo' IS NULL)   
WHERE turmas_has_estudantes'.'turmas_id' = 535 
ORDER BY
    'turmas_has_estudantes'.'numero' ASC,
    'estudantes_identificacao'.'nome_completo' ASC

Note that parentheses have to be placed in their original expression because it uses OR .

    
25.06.2018 / 17:08