SELECT dentro de SELECT

4 views
Skip to first unread message

Pablo

unread,
Dec 9, 2013, 8:06:19 AM12/9/13
to Grupo de Expressões Regulares
Pessoal eu tinha expressão regular para substituir tudo dento do meu select por COUNT(*) 
porem agora me deparei com querys com SELECT dentro do SELECT ex:

SELECT cod_sic, cod_site, cod_autor, nom_completo, nom_parlamentar, txt_biografia, 
               DATE_FORMAT(dat_nascimento, '%d/%m/%Y') as dat_nascimento,
               end_email, end_web, num_tel_parlamentar,
               (SELECT b.sgl_partido 
                FROM   filiacao a INNER JOIN  partido b ON (a.cod_partido = b.cod_partido)
                WHERE  a.ind_excluido = 0 AND b.ind_excluido = 0 AND 
                       a.cod_parlamentar = parlamentar.cod_parlamentar 
                ORDER BY a.dat_filiacao DESC LIMIT 1) as sgl_partido,
                (SELECT num_votos_recebidos 
                FROM   mandato 
                WHERE  ind_excluido = 0 AND parlamentar.cod_parlamentar 
                ORDER BY dat_fim_mandato DESC LIMIT 1) as num_votos_recebidos
               
        FROM   parlamentar                
        
        WHERE  ind_excluido  = 0 AND tip_situacao_militar = 0

Alguém pode me dar uma ajuda pra resolver?

Esta queru deveria ficar assim:

SELECT count(*) 
               
        FROM   parlamentar                
        
        WHERE  ind_excluido  = 0 AND tip_situacao_militar = 0

Pablo

unread,
Dec 9, 2013, 12:13:54 PM12/9/13
to Grupo de Expressões Regulares
Consegui fazer aqui com seguinte código:

private function converteSql($Sql)
    {
        $Sql = preg_replace('/\s/i', ' ', $Sql);
        $Sql = preg_replace('/SELECT.*FROM/i', 'SELECT COUNT(*) as Total FROM ', $Sql);
        
        return $Sql;
    }

Se alguém tiver alguma sugestão será bem vinda.
--
Pablo Vanni

Felipe Pena

unread,
Dec 9, 2013, 1:47:51 PM12/9/13
to expressoes...@googlegroups.com
Boa tarde,

2013/12/9 Pablo <pablo...@gmail.com>:
Essa forma vai te atender até que você não tenha uma query com [NOT]
EXISTS/[NOT] IN no WHERE.


>
> --
> Pablo Vanni
>
> --
> Você está recebendo esta mensagem porque se inscreveu no grupo "Expressões
> regulares" dos Grupos do Google.
> Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie
> um e-mail para expressoes-regul...@googlegroups.com.
> Para postar neste grupo, envie um e-mail para
> expressoes...@googlegroups.com.
> Visite este grupo em http://groups.google.com/group/expressoes-regulares.
> Para obter mais opções, acesse https://groups.google.com/groups/opt_out.



--
Regards,
Felipe Pena

Pablo

unread,
Jan 22, 2014, 9:38:14 AM1/22/14
to Grupo de Expressões Regulares
Alguém pode me ajudar a melhorar meu código?

Este codigo acha tudo que existe entre o SELECT e o ultimo FROM...

Tem como achar só oque esta entre o select e o primeiro FROM?

private function converteSql($Sql)
    {
        $Sql = preg_replace('/\s/i', ' ', $Sql);
        $Sql = preg_replace('/SELECT.*FROM/i', 'SELECT COUNT(*) as Total FROM ', $Sql);
        
        return $Sql;
    }

Hoje ele acha assim:

SELECT id, pasta_id, nome, tipo, caminho FROM ( SELECT pp.id, pp.id AS pasta_id, pp.nome, 0 AS tipo, pp.caminho FROM pasta AS pp WHERE 1 UNION SELECT m.id, p.id AS pasta_id, m.titulo AS nome, m.tipo, CONCAT(p.caminho, "|", m.titulo) AS caminho FROM midia AS m INNER JOIN midia_pasta AS mp ON m.id = mp.midia_id INNER JOIN pasta AS p ON p.id = mp.pasta_id WHERE 1 AND DATE(dt_cadastro) >= '2014-01-15' ) as tudo

Gostaria que fosse assim:

SELECT id, pasta_id, nome, tipo, caminho FROM ( SELECT pp.id, pp.id AS pasta_id, pp.nome, 0 AS tipo, pp.caminho FROM pasta AS pp WHERE 1 UNION SELECT m.id, p.id AS pasta_id, m.titulo AS nome, m.tipo, CONCAT(p.caminho, "|", m.titulo) AS caminho FROM midia AS m INNER JOIN midia_pasta AS mp ON m.id = mp.midia_id INNER JOIN pasta AS p ON p.id = mp.pasta_id WHERE 1 AND DATE(dt_cadastro) >= '2014-01-15' ) as tudo

Tentei {1} tentei ? mas nada funcionou :(
Pablo Vanni
Reply all
Reply to author
Forward
0 new messages