Ir para conteúdo

Arquivado

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

halfar

problemas com intervalo de datas

Recommended Posts

bem, tem algo esquisito acontecendo..

 

tenho uma instrucao sql que relaciona duas tabelas, e utilizo o between para pegar intervalo de datas....

 

 

 

select novidades_tecnologia.data, novidades_tecnologia.pagina, novidades_tecnologia.id_materia, novidades_tecnologia.cliques, novidades_tecnologia.diretorio, novidades_tecnologia.titulo, relat_tecnologia.data_visita, sum(relat_tecnologia.visitas_diarias) as total_visitas, relat_tecnologia.pagina from(novidades_tecnologia inner join relat_tecnologia on relat_tecnologia.pagina = novidades_tecnologia.pagina) where relat_tecnologia.data_visita between '2014-08-11' and '2014-09-10' group by relat_tecnologia.pagina

 

 

ocorre que a instrução acima não traz resultados referente ao mes 09...traz somente referente ao mes 08, exibe vários registros do mes de agosto, de fato em agosto existem vários registros....Mas referente ao mes 09, embora existam registros, não lista nenhum

 

Para piorar, se eu trocar o group by por order by, aí ele traz somente um registro do mes de agosto, deveria trazer mais registros do que a instrução quando utilizo group by, não é verdade?

 

Já testei este codigo diretamente no phpMyAdmin, e é a mesma coisa....

 

será que este between realmente é confiável?

 

estou fazendo varios testes, não dá para explicar tudo aqui, mas os resultados obtidos estão inconsistentes...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, o BETWEEN é confiável.

 

O INNER JOIN especifica que deve ser retornado apenas se houver o relacionamento, caso contrário, não exibirá o resultado.

 

Uma dica, use ALIAS, diminui o tamanho da SQL, e a identação facilita no entendimento:

SELECT
	n. DATA,
	n.pagina,
	n.id_materia,
	n.cliques,
	n.diretorio,
	n.titulo,
	r.data_visita,
	sum(
		r.visitas_diarias
	)AS total_visitas,
	r.pagina
FROM novidades_tecnologia AS n
Inner Join relat_tecnologia AS r ON r.pagina= n.pagina
WHERE
	r.data_visita BETWEEN '2014-08-11' AND '2014-09-10'
GROUP BY
	r.pagina

Compartilhar este post


Link para o post
Compartilhar em outros sites

sera que o erro nao está no entendimento de relacionamento inner join?

 

estou passando no final deste post o link onde poderá ver este relatorio de exibição de paginas, para que possam ter uma melhor compreensão, deixei inclusive a sql visivel e o numero de registros encontrados juntamente proximo a sql...

 

bem, para explicar o que está acontencendo, vamos a um exemplo:

 

na tabela novidades_tecnologia contem o cadastro de uma única determinada materia, e em cujo campo pagina contem o valor pagina_teste.php

 

na outra tabela relacionada chamada relat_tecnologia também contem um campo chamado pagina, mas contem vários registros com o campo pagina = pagina_teste.php, de formas que, se esta tabela possuir 10 registros deveriam ser exibidos 10 registros, a não ser que seja especificado o group by, o que não é o caso, pois deixei por enquanto como order by para ver se está funcionando corretamente.

 

Então não deveria listar todos os 10 registros?

 

Vamos a um exemplo real: Na tabela relat_tecnologia existem 3 registros com datas de 11.08.2014 (vide imagem abaixo)

relat.png

 

 

e para cada uma das paginas listas na imagem acima, existe um registro correspondente na outra tabela.

No entanto, está sempre listando apenas 1 registro, ou seja apenas o primeiro registro transceder_novo_cartao_memoria.php

 

onde poderá estar o erro?


ah...esqueci o link...segue agora:

 

http://www.negocios.online.nom.br/novidades_tecnologicas/relatorios/quantidade_visualizacoes.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma dica é retirar o filtro por data e ver o que query trás, como já foi dito parece ser um caso de um join "faltante" , talvez um OUTER JOIN resolva.

Compartilhar este post


Link para o post
Compartilhar em outros sites

é, retirei o criterio da data, mas continua igual...

 

o que estou estranhando é que este código estava funcionando....

 

fico pensando se não seria o provedor...

 

será que poderiam ter feito alguma configuração errada no provedor???

 

Fico com o pé meio atrás, porque já tive um problema parecido com outro provedor, que estava trabalhando com duas bases de dados, tipo algo mais ou menos assim: quando inseria um registro, ia para uma base de dados,

quando ia realizar consulta, puxavam de uma outra cópia de base de dados,porém desatualizada...

Compartilhar este post


Link para o post
Compartilhar em outros sites

achei uma luz neste caso...

 

tive que retirar a expressão sum(relat_tecnologia.visitas_diarias) as total_visitas da expressão sql.

 

a expressão completa estava assim:

select novidades_tecnologia.data, novidades_tecnologia.pagina, novidades_tecnologia.id_materia, novidades_tecnologia.cliques, novidades_tecnologia.diretorio, novidades_tecnologia.titulo, relat_tecnologia.data_visita, sum(relat_tecnologia.visitas_diarias) as total_visitas, relat_tecnologia.pagina from(novidades_tecnologia inner join relat_tecnologia on relat_tecnologia.pagina = novidades_tecnologia.pagina) where relat_tecnologia.data_visita between '2014-08-11' and '2014-09-10' group by relat_tecnologia.pagina

 

 

se eu mantiver o sum(relat_tecnologia.visitas_diarias) as total_visitas sempre traz como resultado apenas a primeira linha encontrada e ignora as demais...

 

alguem saberia explicar o porque?

 

Mas mesmo assim estou estranhando, pois o codigo funcionava antes...

 

será que o provedor pode ter alguma configuração que prejudique isto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já tentou com totodo agrupamento ?

SELECT novidades_tecnologia.DATA,
       novidades_tecnologia.pagina,
       novidades_tecnologia.id_materia,
       novidades_tecnologia.cliques,
       novidades_tecnologia.diretorio,
       novidades_tecnologia.titulo,
       relat_tecnologia.data_visita,
       sum(relat_tecnologia.visitas_diarias) AS total_visitas,
       relat_tecnologia.pagina
from
      (novidades_tecnologia
           INNER JOIN relat_tecnologia ON relat_tecnologia.pagina = novidades_tecnologia.pagina)
WHERE relat_tecnologia.data_visita BETWEEN '2014-08-11' AND '2014-09-10'
group by novidades_tecnologia.DATA,
         novidades_tecnologia.pagina,
         novidades_tecnologia.id_materia,
         novidades_tecnologia.cliques,
         novidades_tecnologia.diretorio,
         novidades_tecnologia.titulo,
         relat_tecnologia.data_visita,
         relat_tecnologia.pagina

Compartilhar este post


Link para o post
Compartilhar em outros sites

é funcionou....mas nao precisei fazer o grupo todo, bastou apenas o grupo da data e da pagina....

 

aliás nem consigo imaginar um grupo tão grande assim...nem sei como isso funcionaria...

 

mas valeu...agora parece que tá tudo certo.

 

no entanto, fiquei na curiosidade porque tive que especificar o group by, acho que deveria ter funcionado tambem com order by..., mas enfim....tá funcionando agora...é o que importa de momento...

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.