Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

wrn

consulta MySQl

Recommended Posts

Olá,

tenho um sistema em PHP que utiliza TXT omo banco de dados e agora resolvi migrar ele pra MySQl, já criei um sistema que converto os dados dos arquivos TXT e grava em duas tabelas MySQL, agora estou com uma dúvidacom relação a consulta.

 

Primeiramente os campos das tabelas...

 

Tabela com frequências:

cvs_tps
'idtps', 'inisat', 'freq', 'pol', 'sr', 'fec', 'sis', 'modula', 'piloto', 'cobre', 'sinal', 'idemis', 'obs', 'inf', 'tipo', 'tipo2', 'codif', 'compres', 'cor', 'definicao', 'formato', 'a3d', 'vpid', 'apid', 'pcr', 'trans', 'alterou', 'colaborador', 'data', 'user', 'apv'

 

Tabela com emissoras:

cvs_emi
'idemi', 'nome', 'logo', 'idioma', 'origem', 'site', 'aovivo', 'programacao', 'emitipo'

 

No sistema, as frequências são diferenciadas pelo que elas transmitem, cada tipo de transmissão possui um código

RADIO - 9

CANAL DO PACOTE - 5

PACOTE - 2

TV - 1

 

A consulta lista todas as TVs e pacotes, porém quando é RADIO ou CANAL DO PACOTE ele só mostra quando eles possuem o campo 'codif' vazio. até aqui tudo bem, consegui fazer uma consulta que verifica se é RADIO, CANAL DO PACOTE, PACOTE ou TV e em seguida verifica o campo 'codif', exibindo somente a RADIO ou CANAL DO PACOTE que estão com este campo vazio e sempre exibindo PACOTE ou TV.

Colsulta:

SELECT cvs_tps.*, cvs_emi.idemi, cvs_emi.nome
FROM cvs_tps
INNER JOIN cvs_emi ON cvs_tps.idemis=cvs_emi.idemi
WHERE inisat=".$sat." AND (cvs_tps.tipo <= '4' OR (cvs_tps.tipo > '4' AND cvs_tps.codif='FTA')) ORDER BY cvs_tps.freq ASC, cvs_tps.pol ASC, cvs_tps.tipo ASC, cvs_tps.vpid ASC, cvs_tps.apid ASC

 

Agora vem o problema, no caso do PACOTE de TV, quando elas tem uma emissora de RADIO (nas TVs e Pacotes) ou CANAL DO PACOTE com a mesma frequência, gostaria que ao exibir a data de atualização, ele procurasse somente a data mais recente, por exemplo:

 

Existem vários cadastros com a frequência com suas datas de atualização

11777 - PACOTE - 10/12/2012

11777 - CANAL DO PACOTE - 13/12/2012

11777 - CANAL DO PACOTE - 10/12/2012

11777 - RADIO - 16/12/2012

 

Atualmente, ao fazer a consulta mostra-se no PACOTE, a data da atualização do pacote, que seria 10/12/2012, será que é possível na mesma consulta que citei acima, no caso de PACOTE, mostrar a data mais recente da atualização nesta frequência, no exemplo citado seria 16/12/2012 ao invés da data do pacote?

 

Eu só consegui fazer isto utilizando uma segunda consulta quando chega na hora de mostrar a data e com o auxílio de um IF no PHP, mas infelizmente isto mais dobra o tempo de processamento da página, de 0,032 para 0,071 segundos (testado no meu PC).

if($colu['tipo']=="2"){
$query2 = mysql_query("SELECT cvs_tps.inisat, cvs_tps.freq, cvs_tps.pol, cvs_tps.alterou, cvs_tps.colaborador, cvs_tps.data FROM cvs_tps WHERE inisat='".$colu['inisat']."' AND freq='".$colu['freq']."' AND pol='".$colu['pol']."' ORDER BY data DESC LIMIT 1");
while($colu2 = mysql_fetch_array($query2)){
echo $colu2['alterou']." ".
$colu2['colaborador']." ".
$colu2['data']." ";
}
} else {
echo $colu['alterou']." ".
$colu['colaborador']." ".
$colu['data']." ";
}

 

Como estou iniciando esta construção do código em MySQL, nem sei se é possível fazer isto, pesquisei no Google, mas não encontrei nada parecido...

 

Ah, talvez olhando o código da minha primeira consulta, talvez possam também analizar e dar algumas dicas.

 

Obrigado desde já!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não lembro agora se o comando para pegar a maior data no MySQL é o mesmo no SQLServer, mas para o seu caso acho que terá que usar o comando MAX com um group by para pegar a maior data. Algo como o mostrado abaixo:

 

SELECT cvs_tps.inisat, cvs_tps.freq, cvs_tps.pol, cvs_tps.alterou, cvs_tps.colaborador, max(cvs_tps.data)
FROM cvs_tps 
WHERE inisat='".$colu['inisat']."' AND freq='".$colu['freq']."' AND pol='".$colu['pol']."' 
GROUP BY cvs_tps.inisat, cvs_tps.freq, cvs_tps.pol, cvs_tps.alterou, cvs_tps.colaborador
ORDER BY data DESC LIMIT 1

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Chrnos,

Primeiramente obrigado pela resposta!

 

Mas a dúvida não está na segunda consulta que citei, queria saber se tem como colocar isto dentro da primeira algo como uma consulta dentro de outra colsulta, ao realizar a consulta, ele já verificar, caso seja um PACOTE, pegar já a data da última atualização dos CANAIS DO PACOTE.

 

Com duas consultas funciona, porém aumenta muito processamento do servidor (mais que dobra o tempo de processamento 0,032 para 0,071 segundos) e estou tentando reduzir isso, o servidor reclamou que meu site está usando muito processamento e taxa grande (25GB/mês).

 

 

Acabo de encontrar um exemplo de subquery, que pode ser utilizado para mostrar o que quero fazer:

SELECT *, (SELECT COUNT(*) FROM classificados cl WHERE cl.cod_anunciante = a.cod_anunciante) AS total_anuncios FROM anunciantes a, cidades c, niveis_acesso_anunciantes n
               WHERE a.cod_cidade = c.cod_cidade AND a.cod_nivel = n.cod_nivel

 

Neste caso a subquery conta a quantidade de anúncios e coloca ela em total_anuncios atravéz do AS, no meu caso eu queria que ela pegasse a data mais recente e colocasse em data_recente com um AS, porém não estou conseguindo, já fiz vários testes enenhum retorna.

 

Tentei da colocar ela dentro do código da seguinte forma:

SELECT cvs_tps.*, cvs_emi.idemi, cvs_emi.nome, 
(SELECT cvs_tps.inisat, cvs_tps.freq, cvs_tps.pol, cvs_tps.data FROM cvs_tps WHERE inisat='".$sat."' AND freq=cvs_tps.freq AND pol=cvs_tps.pol ORDER BY data DESC LIMIT 1) AS data_recente
FROM cvs_tps
INNER JOIN cvs_emi ON cvs_tps.idemis=cvs_emi.idemi
WHERE inisat=".$sat." AND (cvs_tps.tipo <= '4' OR (cvs_tps.tipo > '4' AND cvs_tps.codif='FTA')) ORDER BY cvs_tps.freq ASC, cvs_tps.pol ASC, cvs_tps.tipo ASC, cvs_tps.vpid ASC, cvs_tps.apid ASC

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.