'Subqueries in the same table in mysql

I have a raw SQL query that I'm using in Laravel framework to get last presence of a user in a convocation table. Basically, the master query is to get all the convocations of a given user that belongs to a specific ministry. Like:

    Select
    `conv_pessoas.`id`,
    `conv_pessoas`.`pessoa_id`,
    `conv_pessoas`.`created_at`,
    `conv_pessoas`.`data_chegada`,
    `conv_pessoas`.`data_saida`,
    `pessoas`.`nome`,
    `ministerios`.`nome` as `ministerio_nome`,
    `eventos`.`nome` as `evento_nome`,
    `evento_data`.`data_inicial` as `data_evento_inicial`,
    `evento_data`.`data_final` as `data_evento_final`,
    (
    SELECT
        max(`convocacao_ministerio_pessoas`.`data_chegada`)
    FROM
        `convocacao_ministerio_pessoas`
    WHERE
        `convocacao_ministerio_pessoas`.`pessoa_id` = `conv_pessoas`.`pessoa_id`
        AND `convocacao_ministerio_pessoas`.`data_chegada` IS NOT NULL
    ) as ultima_presenca_geral,
    (
    SELECT
        max(`convocacao_ministerio_pessoas`.`data_chegada`)
    FROM
        `convocacao_ministerio_pessoas`
    WHERE
        `convocacao_ministerio_pessoas`.`pessoa_id` = `conv_pessoas`.`pessoa_id`
        AND `convocacao_ministerio_pessoas`.`ministerio_id` =   `conv_pessoas`.`ministerio_id`
        AND `convocacao_ministerio_pessoas`.`data_chegada` IS NOT NULL
    ) as ultima_presenca_no_ministerio,
    (
    SELECT
        count(*)
    FROM
        `convocacao_ministerio_pessoas`
    WHERE
        `convocacao_ministerio_pessoas`.`pessoa_id` = `conv_pessoas`.`pessoa_id`
        AND `convocacao_ministerio_pessoas`.`ministerio_id` =     `conv_pessoas`.`ministerio_id`
    ) as qtd_convocacoes_no_ministerio,
    (
    SELECT
        count(*)
    FROM
        `convocacao_ministerio_pessoas`
    WHERE
        `convocacao_ministerio_pessoas`.`pessoa_id` = `conv_pessoas`.`pessoa_id`
        AND `convocacao_ministerio_pessoas`.`ministerio_id` =   `conv_pessoas`.`ministerio_id`
        AND `convocacao_ministerio_pessoas`.`data_chegada` IS NOT NULL
    ) as qtd_presenca_no_ministerio
    from
    `convocacao_ministerio_pessoas` as `conv_pessoas`
    inner join `pessoas` on `conv_pessoas`.`pessoa_id` = `pessoas`.`id`
    inner join `convocacaos` on `conv_pessoas`.`convocacao_id` = `convocacaos`.`id`
    inner join `ministerios` on `conv_pessoas`.`ministerio_id` = `ministerios`.`id`
    inner join `eventos` on `convocacaos`.`evento_id` = `eventos`.`id`
    inner join `evento_data` on `convocacaos`.`data_evento_id` = `evento_data`.`id`
    where
    `conv_pessoas`.`ministerio_id` = '2'
    and `convocacaos`.`church_id` = 1
    and `evento_data`.`data_final` between '2022-02-19 00:00:00'
    and '2022-02-22 23:59:59'

But I need to get the last presence of this user in this same convocation table, but It's not necessary to be in the same ministry. I've created subqueries for that. But I'm not sure if it's the best approach. I need some help to ensure I'm using the bests practices. ( I'm not advanced in SQL ).

**notes:**
Translations:
ministerio = ministry
convocacao = convocation
pessoa = person (user)
evento = event
data chegada = arrival date

enter image description here



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source