Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Contar registros de duas tabelas com critérios de con


adri2005

Pergunta

Olá amigos!

Acabei de entrar no forum, e estou com um problema (que surgem ao longo do aprendizado, ne?). O problema é o seguinte:

Eu tenho duas tabelas: Cadastros e Atualizações

Preciso contar quantos cadastros existem por bairro. A tabela Cadastros tem os cadastros únicos (sem repetição), e a tabela Atualizações tem as atualizações de cadastros (que pode não ter nenhuma ou diversas).

Assim, não estou conseguindo desenvolver um codigo em mysql (dentro de um script PHP) para esta conta, estou quebrando a cabeça para resolver. Vou colocar abaixo como estou tentando fazer:

Se eu faço um simples count:

select bairro, count(bairro) as total from cadastros group by bairro;

Retorna apenas os resultados da tabela Cadastros.

E se eu tento usar UNION:

select bairro, count(bairro) as total from (select bairro from cadastros union select bairro from atualizacoes) as temp group by bairro;

Ele retorna os registros da 1ª tabela mais os da segunda.

Entenderam o meu problema? Se existir uma (ou mais) atualizações na tabela Atualizações, apenas o registro mais recente deve ser considerado no count, e desconsiderado o respectivo cadastro da tabela Cadastros (através do ID do cadastro).

Abraço a todos e ficarei muito agradecido a quem puder me ajudar! E postem aí caso o tópico gere duvidas (assim como eu estou confuso rss).

Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

Olá, Denis

Agradeço a resposta, tentei adaptar o código do post que voce mencionou, e não consegui fazer funcionar. Estou praticando mais as clausulas (inner|left|right) join, embora eu ainda não entenda exatamente o conceito, mas de ontem para hoje eu tive mais algumas ideias para tentar resolver o problema, conforme cito abaixo:

- Preciso ordenar em uma unica consulta as duas tabelas (com os campos especificos), de forma que exiba apenas a ultima atualização do referido ID_usuario (caso haja), através do max(id) da tabela atualizações, que é gerado atraves do auto incremento, e tambem é necessário que o id_usuario da tabela cadastros seja omitido da consulta, pois no caso do cadastro ter alguma (ou varias) atualizações, apenas a ultima atualização deve ser exibida. Desafio, hein?

- Por fim, preciso contar quantos cadastros existem por bairro (ambas as tabelas cadastros e atualizacoes são iguais, a diferença é que a tabela atualizacoes pode ter varios registros com o mesmo id_usuario, enquanto na tabela cadastros há apenas um registro por id_usuario).

Eu já havia feito a consulta, e funcionou perfeitamente usando apenas a tabela cadastros, aí não houve problemas, dei um count(bairro), e depois dentro do código do PHP criei as variaveis e as formas de exibir os dados. Mas quando percebi que precisava considerar tambem a tabela atualizacoes o problema se tornou um bicho de 7 cabeças hehehe, pois não sei se o melhor é estruturar uma consulta complexa, usar loops do php ou um esquema por array.

Eu já fiz coisas bem complicadas com mysql/php, varias vezes eu improviso, mas neste caso estou um tanto confuso.

O que você acha que eu poderia fazer mais?

Mais uma vez obrigado. Um abraço.

Link para o comentário
Compartilhar em outros sites

  • 0

Como pedi no outro post, por favor publique as instruções create table das tabelas envolvidas.(campos e indices) os campos podem ter outros nomes, pois não estou interessado em seu negócio. apenas quero ajudar.

Link para o comentário
Compartilhar em outros sites

  • 0

Aí vai:

CREATE TABLE `cadastros` (
`id` int(6) not null auto_increment,
`id_usuario` int(6) not null,
`data` varchar(10) not null,
`categoria` tinyint(1) not null,
`nome` varchar(255) not null,
`sexo` varchar(1) not null,
`rg` varchar(14) not null,
`cpf` varchar(11) not null,
`nascimento` varchar(10) not null,
`endereco` varchar(255) not null,
`numero` int(6) not null,
`bairro` varchar(80) not null,
`escolaridade` tinyint(1) not null,
`profissao` varchar(100) not null,

PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=2078;


CREATE TABLE `atualizacoes` (
`id` int(6) not null auto_increment,
`id_usuario` int(6) not null,
`data` varchar(10) not null,
`categoria` tinyint(1) not null,
`nome` varchar(255) not null,
`sexo` varchar(1) not null,
`rg` varchar(14) not null,
`cpf` varchar(11) not null,
`nascimento` varchar(10) not null,
`endereco` varchar(255) not null,
`numero` int(6) not null,
`bairro` varchar(80) not null,
`escolaridade` tinyint(1) not null,
`profissao` varchar(100) not null,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=474;

Abs

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, sim, esqueci de mencionar isto: é o campo id_usuario nas duas tabelas. Eu não usei o campo id (chave primaria) da tabela cadastros porque tive problemas com varios usuarios cadastrando, varios novos cadastros tentavam inserir o mesmo numero de id na tabela, então criei uma terceira tabela para criar numeros sequenciais, assim não tem como dois cadastros simultaneos terem o mesmo numero de ID.

Então criei no php um simples $i++ para ir incrementando o numero na tabela.

Respondendo a sua pergunta: é o campo id_usuario, a diferença das duas tabelas é que na tabela cadastros este campo tem dados unicos, como se fosse a chave primaria.

Abs

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Denis!

Consegui! Não fiz muitos testes ainda, mas pelo que vi está funcionando certinho. Utilizei 2 subconsultas na mesma query. Sei que não é recomendável usar subqueries, mas foi o jeito que encontrei. E para pegar a ultima atualizacao usei o campo data_cadastro usando o str_to_date para formatar a data para 'Ymd', aí foi apenas dar um 'order by data desc'. Abaixo o codigo que fiz:

select bairro, count(bairro) as total from (select id, id_usuario, bairro, str_to_date(data_cadastro, '%d/%m/%Y') as data from (select * from cadastros union select * from atualizacoes order by data desc) as sub group by id_usuario) as sub2 group by bairro;

O resultado está do jeito que eu precisava, conforme abaixo:

Bairro Quantidade
CENTENARIO 2
CENTRO 2
TESTE 1

Ele está puxando os cadastros mais atualizados, buscando nas duas tabelas e exibindo apenas 1 resultado por cadastro, mesmo que haja varios registros na tabela atualizacoes, e o total tambem confere.

Agradeço a disposição de me ajudar e por mim dou o post como encerrado!

Abraço

Editado por adri2005
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152.1k
    • Posts
      651.8k
×
×
  • Criar Novo...