Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia Pessoal, tudo bom?
Seguinte, eu tenho uma consulta em SQL feita com INNER JOIN e ORDER BY:
$pesquisar = "SELECT * FROM tb_cad_cli_condominio INNER JOIN tb_cad_cli_apartamento ON tb_cad_cli_condominio.pk_cli_condominio = pk_cli_condominio_id ORDER BY nome_predio";
bom, nesta consulta estou conseguindo trazer os dados que eu preciso corretamente onde me informa os os apartamentos de cada condomínio =D
mais além disso preciso trazer a contagem de quantos apartamentos tem em cada condomínio. eu pesquisei e fiquei sabendo que com GROUP BY junto com COUNT dentro do SQL isso é possível.
alguem pode me ajudar? preciso trazer quantos condomínios tem em cada apartamento (numero) e mostrar os apartamentos que fazem parte do condominio (nomes).
Será que tudo isso na mesma consulta é possível? ou terei que fazer uma nova consulta?
Valew pessoal...
Abraços!
>
Imagino que esteja trabalhando com MySQL. Portanto, para ter mais chances de esclarecer sua dúvida, poste na área correta: iMasters Fóruns -> MySQL
Daniel, obrigado pelo post.. vou posta lá, não sabia que tinha um fórum de MySQL.
Obrigado.. abraços!
ORDER BY sempre tem que ter ou DESC ou ASC ;)
Bom pessoal, valew pelo post.
consegui retornar a contagem de apartamentos em cada condominio fazendo assim:
$count = "SELECT count(*) as total FROM tb_cad_cli_condominio INNER JOIN tb_cad_cli_apartamento ON tb_cad_cli_condominio.pk_cli_condominio = pk_cli_condominio_id GROUP BY nome_predio";
a dúvida agora é a seguinte.
Eu tenho um while que começa a montar a tabela, só que chega em uma célula da tabela que eu tenho que mostrar esse numero que de apartamentos do condominio.
Então dentro do meu primeiro while, eu fiz outra consulta e outro while: tudo isso dentro de uma célula da tabela.
Bom, deu certo, porém esse segundo while, traz dentro da mesma célula a quantidade dos apartamentos de todos os condominios:
A pergunta é: tem alguma forma de fazer esse while trazer 1 por 1 em cada volta do primeiro while?
O código do segundo while está logo abaixo:
Abraços!
$count = "SELECT count(*) as total FROM tb_cad_cli_condominio INNER JOIN tb_cad_cli_apartamento ON tb_cad_cli_condominio.pk_cli_condominio = pk_cli_condominio_id GROUP BY nome_predio";
$query2 = mysql_query($count);
while ($linha = mysql_fetch_array($query2)){
echo $linha['total'];
}Faz um INNER JOIN ... acho que é o melhor no que tu quer fazer ..
>
Faz um INNER JOIN ... acho que é o melhor no que tu quer fazer ..
Minhas consultas já estão com inner join =D
hehehe .. nao tinha visto, erro meu .. cara, fazendo varios whiles dentro um do outro vai fazer um acumulo de dados ...
mas pq seu INNER JOIN nao trás tudo junto ?
>
Faz um INNER JOIN ... acho que é o melhor no que tu quer fazer ..
é verdade, acabei de me fazer essa mesma pergunta.. :S
hahaha,
eu já tentei fazer isso, e coloquei essa consulta:
$count = "SELECT count(*) as total FROM tb_cad_cli_condominio INNER JOIN tb_cad_cli_apartamento ON tb_cad_cli_condominio.pk_cli_condominio = pk_cli_condominio_id GROUP BY nome_predio";
se eu uso ela, dai ela só me retorna a soma dos dos apartamentos.. ai como quero saber o nome do apartamento, telefone e outros, já não aparece nada...
pq será?
Por que no select tu nao manda busca nada ... SELECT apt,condominio,salas, ....
ve se nao é isso cara ?
>
Por que no select tu nao manda busca nada ... SELECT apt,condominio,salas, ....
ve se nao é isso cara ?
Então Amigo, tentei aqui nao deu certo nao.. acho que ainda estou pecando em um erro besta.
a minha consulta para trazer os dados dos apartamentos e condominios é essa:
$pesquisar = "SELECT * FROM tb_cad_cli_condominio INNER JOIN tb_cad_cli_apartamento ON tb_cad_cli_condominio.pk_cli_condominio = pk_cli_condominio_id ORDER BY nome_predio";
e a consulta feita para trazer a quantidade de apartamentos em cada condominio é essa:
$count = "SELECT count(*) as total FROM tb_cad_cli_condominio INNER JOIN tb_cad_cli_apartamento ON tb_cad_cli_condominio.pk_cli_condominio = pk_cli_condominio_id GROUP BY nome_predio";
eu tenho que conseguir fazer a mesma funcao da consulta de baixo, junto com a consulta de cima, mais sem perder dados entende?
Abrass
$pesquisar = "SELECT tccc.,tcca. FROM tb_cad_cli_condominio tccc INNER JOIN tb_cad_cli_apartamento tcca ON tccc.pk_cli_condominio = tcca.pk_cli_condominio_id ORDER BY tccc.nome_predio";
ve se muda algo
>
$pesquisar = "SELECT tccc.,tcca. FROM tb_cad_cli_condominio tccc INNER JOIN tb_cad_cli_apartamento tcca ON tccc.pk_cli_condominio = tcca.pk_cli_condominio_id ORDER BY tccc.nome_predio";
ve se muda algo
Gremio10 , Muito obrigado pelo ajuda.
neste exemplo que tu me mandou, ele me retornou normalmente os dados do condominio e do apartamento, sem erro como antes tava acontecendo.
Porém, nao consegui fazer a contagem de apartamentos em condominio. :S
tentei dar um print no tccc - tcca e nada.
lembrando que meu array $dados já está pronto, pois ele imprimi as outras informações normalmente...
mais alguma ideia??
Estou tentando aqui e pesquisando mais, mas ta dificil.. hehehe
valew aii..
Abraço.
o melhor que tu poderia fazer é puxar todos os campos individualmente, para que nao tenha duplicidade de nomes ..
digamos que na tbm tccc tem ...
id | nome | data | condominio
e na tcca tem ....
id | nome | apt
temos dois id e nome ...
faz assim.
>
tccc.nome AS nome,
tcca.nome AS nome_a,
.
.
.
Não tem como trazer os dados em duplicidade, pq os nomes dos campos das tabelas estão todos diferentes.
o que preciso, é fazer o inner join entre elas e tbm contar quantos apartamentos tem em cada condominio usando o COUNT e GROUP BY.
só que nao consigo colocar esses dois tipos de consulta em uma só, e se coloco separadamente, o while sai errado...
abrass
mas entao.
COUNT(tccc.condominio) AS condominio_total, COUNT(tcca.apartamento) AS apartamento_total
nao funciona assim ?
Olha, analisando por cima o seu tópico, acredito que a solução do seu problema esteja em utilizar um GROUP BY ... WITH ROLLUP
Carlos Eduardo
Gremio10 , pelo que eu testei aqui não deu certo essa forma.. a não ser que esteja errando aqui..
e Matias Rezende, vou dar uma lida nisso..
Se alguem tiver outra sugestão ai, por favor poste aii..
Obrigado pessoal.
Matias,
lendo o que você passou, vi que a função funciona com GROUP BY, porém preciso do GROUP BY para somar as funcções e ORDER BY para me mostrar o relacionamento..
preciso desses dois caras, juntos na mesma consulta..
Alguma ideia?
Abraços
Pessoal, alguem sabe fazer uma query ultilizando GROUP BY e ORDER BY na mesma query?
é disso que preciso
O GROUP BY serve como ordenação também. Como está a query neste momento?
(Como a dúvida é basicamente na montagem da query, vou mover para o fórum de MySQL).
Carlos Eduardo
Bom dia, Matias obrigado pela resposta.
Eu tenho duas query's que funcionam:
essa:
$pesquisar = "SELECT * FROM tb_cad_cli_condominio INNER JOIN tb_cad_cli_apartamento ON tb_cad_cli_condominio.pk_cli_condominio = pk_cli_condominio_id ORDER BY nome_predio";
Por causa do inner join, consigo mostrar o nome dos apartamentos que fazem parte do condominio.
e tenho essa:
SELECT count(*) as total FROM tb_cad_cli_condominio INNER JOIN tb_cad_cli_apartamento ON tb_cad_cli_condominio.pk_cli_condominio = pk_cli_condominio_id GROUP BY nome_predio;
que me mostra a contagem de quantos apartamentos tem em cada condominio.
Como estou motando uma tabela dentro do while, preciso que uma só consulta faça a função das duas.
pois ai, consigo pegas o nome dos apartamentos do condominio, e numero de apartamentos que cada condominio tem.. entendeu?
pq se eu montar outro while dentro do while que já tenho, ele vai me trazer os numeros todos juntos em uma só célula da tabela.
Alguem pode me ajudar?
Abraçoss...
Certo. Analisando o problema melhor, acho que o seu caso não necessita do ROLLUP. Veja se esta query retorna o que você espera:
SELECT , count() as total FROM tb_cad_cli_condominio INNER JOIN tb_cad_cli_apartamento ON tb_cad_cli_condominio.pk_cli_condominio = pk_cli_condominio_id GROUP BY nome_predio;
Só que esta é uma consulta "errada". Veja, o ideal é definir os campos necessários (mesmo que sejam todos), pois com o *, é necessário que o MySQL realize um DESCRIBE TABLE (se não me engano) para identificar os campos da tabela.
Carlos Eduardo
Matias,
muito obrigado mesmo pela resposta. Avançamos mais um pouco.
bom, agora deu certo, consegui pegar a quantidade de apartamentos em cada condominio e fazer ele exibir no mesmo while.
Então como você disse, coloquei somente os campos que eu preciso, mas o problema é que agora no while, ele só mostra um apartamento em cada condominio.
por ex:
Nome Condomínio: Teste || Telefone: 41-0000-000 || Quantidade Apartamentos: 4
------------------------------------------------------------------------------
Nome Apartamento: Apartamento do Condominio Teste.
-----------------------------------------------------------------------------
Na verdade, não era pra ele mostrar 4 apartamentos?
Na consulta de antes, ele estava mostrando isso, mas a contagem não. entendeu?
Os campos que eu selecionei foram esses, entao minha consulta ficou assim:
$pesquisar = "SELECT nome_predio, telefone_predio, data_cadastro_condominio, nome_cliente_apartamento, count(*) as total FROM tb_cad_cli_condominio INNER JOIN tb_cad_cli_apartamento ON tb_cad_cli_condominio.pk_cli_condominio = pk_cli_condominio_id GROUP BY nome_predio";
Acho que preciso agora do Order By, na mesma consulta, para juntar o nome dos apartamentos em cada condominio.
Valeww
Modifique o GROUP BY e o COUNT(), colocando o ID do apartamento. Se não funcionar, poste a estrutura das tabelas para que eu faça alguns testes.
Carlos Eduardo
Carlos Eduardo, eu modifiquei com o ID do apartamento, e não deu certo. continuou trazendo da mesma forma... =/
segue a estrutura das tabelas.... Valeww
-- Estrutura da tabela tb_cad_cli_apartamento
--
CREATE TABLE IF NOT EXISTS `tb_cad_cli_apartamento` (
`pk_cli_apartamento` int(11) NOT NULL AUTO_INCREMENT,
`pk_cli_condominio_id` int(11) NOT NULL,
`nome_cliente_apartamento` varchar(45) NOT NULL,
`cpf_cliente` varchar(50) DEFAULT NULL,
`telefone_cliente` varchar(45) DEFAULT NULL,
`celular_cliente` varchar(45) DEFAULT NULL,
`email_cliente` varchar(45) DEFAULT NULL,
`tamanho_apartamento` varchar(50) DEFAULT NULL,
`nome_vendedor` varchar(50) DEFAULT NULL,
`dados_adicionais` varchar(45) DEFAULT NULL,
`data_cadastro` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`pk_cli_apartamento`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=22 ;
--
-- Extraindo dados da tabela tb_cad_cli_apartamento
--
INSERT INTO tb_cad_cli_apartamento (pk_cli_apartamento, pk_cli_condominio_id, nome_cliente_apartamento, cpf_cliente, telefone_cliente, celular_cliente, email_cliente, tamanho_apartamento, nome_vendedor, dados_adicionais, data_cadastro) VALUES
(14, 13, 'Teclado 3', '', '', '', '', '300', 'LOL', '', '2010-12-27 11:39:16'),
(15, 14, 'Sasdelli TESTE A1', '', '', '', '', '300', 'TESTE A1', '', '2010-12-27 11:42:44'),
(16, 13, 'Seu Joao', '', '', '', '', '120', 'LOL', '', '2010-12-27 13:15:55'),
(18, 16, 'Teclado 3', '', '', '', '', '300', 'TESTE A1', '', '2010-12-31 16:58:17'),
(19, 16, 'Dona Maria', '3216549871', '', '', '', '120', 'LOL', '', '2011-01-01 17:58:33'),
(20, 16, 'Dona', '', '', '', '', '321', 'TESTE A1', '', '2011-01-01 19:36:44'),
(21, 16, 'Dona Maria', '3216549871', '', '', '', '130', 'LOL', '', '2011-01-03 14:00:06');
-- Estrutura da tabela tb_cad_cli_condominio
--
CREATE TABLE IF NOT EXISTS `tb_cad_cli_condominio` (
`pk_cli_condominio` int(11) NOT NULL AUTO_INCREMENT,
`nome_predio` varchar(50) NOT NULL,
`telefone_predio` varchar(50) NOT NULL,
`email_predio` varchar(50) DEFAULT NULL,
`endereco_predio` varchar(50) NOT NULL,
`bairro_predio` varchar(50) NOT NULL,
`cidade_predio` varchar(50) NOT NULL,
`estado_predio` varchar(50) NOT NULL,
`qtde_condominios` int(10) DEFAULT NULL,
`dados_adicionais_condominio` longtext,
`nome_sindico` varchar(50) NOT NULL,
`telefone_sindico` varchar(50) DEFAULT NULL,
`celular_sindico` varchar(50) DEFAULT NULL,
`email_sindico` varchar(50) DEFAULT NULL,
`dados_adicionais_sindico` longtext,
`nome_adm_condominio` varchar(50) NOT NULL,
`telefone_adm` varchar(50) NOT NULL,
`email_adm` varchar(50) NOT NULL,
`cnpj_adm` varchar(45) NOT NULL,
`pessoa_resp_adm` varchar(50) NOT NULL,
`rua_adm` varchar(45) DEFAULT NULL,
`bairro_adm` varchar(50) DEFAULT NULL,
`cidade_adm` varchar(45) DEFAULT NULL,
`estado_adm` varchar(45) DEFAULT NULL,
`dados_adicionais_adm` longtext,
`data_cadastro_condominio` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`pk_cli_condominio`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;
--
-- Extraindo dados da tabela tb_cad_cli_condominio
--
INSERT INTO tb_cad_cli_condominio (pk_cli_condominio, nome_predio, telefone_predio, email_predio, endereco_predio, bairro_predio, cidade_predio, estado_predio, qtde_condominios, dados_adicionais_condominio, nome_sindico, telefone_sindico, celular_sindico, email_sindico, dados_adicionais_sindico, nome_adm_condominio, telefone_adm, email_adm, cnpj_adm, pessoa_resp_adm, rua_adm, bairro_adm, cidade_adm, estado_adm, dados_adicionais_adm, data_cadastro_condominio) VALUES
(13, 'Robson Sasdelli', 'asd', 'robson@sasdelliinformatica.com.br', 'TESTE A11', 'TESTE A1', 'TESTE A1', 'Paraná', 120, '', '', '', '', '', '', 'Caixa de som', '5632149875', 'emailadm@hotmail.com', '4598657', 'asd', 'asd', 'lap', 'dourados', 'SP', '', '2010-12-27 11:38:48'),
(14, 'Caixa de Som', 'asd', 'robson@sasdelliinformatica.com.br', 'TESTE A1', 'TESTE A1', 'TESTE A1', 'Paraná', 120, '', '', '', '', '', '', 'Caixa de som', '5632149875', 'emailadm@hotmail.com', '4598657', 'asd', 'asd', 'lap', 'dourados', 'SP', '', '2010-12-27 11:38:58'),
(16, 'Arlindo', 'asd', 'robson@sasdelliinformatica.com.br', 'asd', 'Pinheirinho', 'Curitiba', 'Paraná', 120, '', '', '', '', '', '', 'Caixa de som', '5632149875', 'emailadm@hotmail.com', '4598657', 'asd', 'asd', 'lap', 'dourados', 'SP', '', '2010-12-31 16:57:53');
Uhn... fiz diversos testes e acho que não vai dar certo este resultado que você quer mostrar só com uma consulta. O máximo que eu consegui foi este aqui:
SELECT nome_predio, telefone_predio, data_cadastro_condominio, nome_cliente_apartamento, pk_cli_apartamento, COUNT(nome_predio) AS total
FROM tb_cad_cli_condominio
INNER JOIN tb_cad_cli_apartamento ON tb_cad_cli_condominio.pk_cli_condominio = pk_cli_condominio_id
GROUP BY nome_predio, pk_cli_apartamento WITH ROLLUP
Que trás os resultados assim:
+-----------------+-----------------+--------------------------+--------------------------+--------------------+-------+
| nome_predio | telefone_predio | data_cadastro_condominio | nome_cliente_apartamento | pk_cli_apartamento | total |
+-----------------+-----------------+--------------------------+--------------------------+--------------------+-------+
| Arlindo | asd | 2010-12-31 16:57:53 | Teclado 3 | 18 | 1 |
| Arlindo | asd | 2010-12-31 16:57:53 | Dona Maria | 19 | 1 |
| Arlindo | asd | 2010-12-31 16:57:53 | Dona | 20 | 1 |
| Arlindo | asd | 2010-12-31 16:57:53 | Dona Maria | 21 | 1 |
| Arlindo | asd | 2010-12-31 16:57:53 | Dona Maria | NULL | 4 |
| Caixa de Som | asd | 2010-12-27 11:38:58 | Sasdelli TESTE A1 | 15 | 1 |
| Caixa de Som | asd | 2010-12-27 11:38:58 | Sasdelli TESTE A1 | NULL | 1 |
| Robson Sasdelli | asd | 2010-12-27 11:38:48 | Teclado 3 | 14 | 1 |
| Robson Sasdelli | asd | 2010-12-27 11:38:48 | Seu Joao | 16 | 1 |
| Robson Sasdelli | asd | 2010-12-27 11:38:48 | Seu Joao | NULL | 2 |
| NULL | asd | 2010-12-27 11:38:48 | Seu Joao | NULL | 7 |
+-----------------+-----------------+--------------------------+--------------------------+--------------------+-------+
11 rows in set (0.00 sec)
Carlos Eduardo
Bom, como voce mesmo disse, não é da forma que preciso.
Acho que ou é um ou é outro né?
ou contamos os resultados, ou mostramos os apartamentos de cada condomínio.
Mais deve ter alguma forma de fazer isso.
Bom, mais de qualquer forma Carlos, MUITO obrigado pela paciência e pela ajuda. Se por acaso, tiver outra ideia pra que eu consiga resolver esse caso.
Posta ai.
Valew pessoal... Obrigado!
Boa Tarde pessoal.
Estou aqui denovo hehehe.
Bom, tive outra ideia para tentar resolver esse caso..
Estava pensando, se eu conseguir fazer um while somente no $dados['nome_cliente_apartamento'];
mais ou menos assim. Enquanto $dados['nome_cliente_apartamento'] tiver algum valor, emtao ele pega todos esses valores, conta quantos ele achou e depois soma.
Será que da certo?
é uma ideia, mais nao to conseguindo desenvolver...
Se alguem puder, ajuda aii..
Abraços!
Imagino que esteja trabalhando com MySQL. Portanto, para ter mais chances de esclarecer sua dúvida, poste na área correta: iMasters Fóruns -> MySQL