Ir para conteúdo

POWERED BY:

Arquivado

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

My name is Jan Lucas

Select com INER JOIN e o LIKE

Recommended Posts

Boa Noite!

Eu tenho um sistema de chamados. E tenho uma tabela de nome "usuarios" e uma tabela de nome "chamados".

Na tabela de nome usuarios eu tenho "id_user", "nome_user", "setor". E na tabela chamados eu tenho o "id_chamado","id_user_fk", "mensagem".

Tem-se o relacionamento entre as duas tabelas através usuarios.id_user e chamados.id_user_fk !

 

Eis a questão, eu quero selecionar o campo "setor" da tabela "usuarios" e saber quantos chamados foram de um determinado setor, neste caso quero saber a quantidade de chamados que foram do setor "informatica".

Eu ja tentei aqui mas não da em nada.

 

 

Galerinha, Agradeço ai qualquer tipo de ajuda.

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jan Lucas, poste como você tentou montar sua query para ajudarmos.

Você vai ter que utilizar o count() para contar os chamados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

	
$x = mysql_query("SELECT 									user_admin.id, 									
user_admin.setor, 
helps.id_user_fk 									
FROM user_admin INNER JOIN helps ON user_admin.id = helps.id_user_fk AND user_admin.setor LIKE 
%INFORMATICA%"); 				
$quant = mysql_num_rows($x);

 

Assim eu gostaria de saber quantos de informática tem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php
$setores = array(
1=>"SUPERINTENDÊNCIA", 2=>"SUP ADJUNTA", 3=>"PLANEJAMENTO", 4=>"COMUNICAÇÃO", 5=>"DIR ÁGUAS SUPERFICIAIS",
6=>"DEPT ESTUDOS E PROJETOS", 7=>"DEPT CONSTR DE OBRAS E BARRAGENS", 8=>"DEPT OBRAS TRANSF DE ÁGUAS", 
9=>"DEPT DE PEQ OBRAS HÍDRICAS - S.J", 10=>"DIR DE ÁGUAS SUBTERRÂNEAS", 11=>"DEPT DE ESTUDOS HIDROGEOLÓGIC", 
12=>"DEPT DE CONSTRUÇÃO DE POÇOS", 13=>"DEPT DE INSTALAÇÃO DE POÇOS", 14=>"DIR ADMINISTRATIVO - FINANCEIRA", 
15=>"DEPT DE RECURSOS HUMANOS", 16=>"DEPT MAT E PATRIMÔNIO/TRANSPORTE", 17=>"DEPT DE SERVIÇOS GERAIS", 18=>"DEPT FINANCEIRO", 
19=>"DEPT DE MÁQUINAS E OFICINAS", 20=>"INFORMÁTICA", 21=>"PRODHAM");
//aqui tem um for pra passar os indices de cada setor automatico.
       for ($i=1; $i<=20; $i++){
	$x = mysql_query("SELECT
	user_admin.id,
	user_admin.setor,
	helps.id_user_fk
	FROM user_admin INNER JOIN helps ON user_admin.id = helps.id_user_fk AND user_admin.setor = $setores[$i]"); //seleciona da tabela user_admin que é onde tem os setores, ai é verificado se o que correndo no array é igual ao que ta lah. Assim quero mostrar a quantidade.
	$quant = mysql_num_rows($x);
	print "
	<tr>
	<td>$setores[$i]</td>
	<td>$quant</td>
	</tr>";
}
?>

Só que só está mostrando o nome do Setor mas a quantidade não mostra. Não entendo o Motivo.

 

Abraço! espero que entendam.

Compartilhar este post


Link para o post
Compartilhar em outros sites

e tá aparecendo 0 (zero)?

 

então o teu SELECT não casou nenhum registro.

tipo.. eu to achando 'feia' essa forma que você tá fazendo...

 

posta a estrutura da tabela setor, e da help

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não! Não aparece 0. Aparece nada.

E gera muitos este erro. E o for os repete muitas vezes.

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\helpdesk\adm\resultado_por_setor.php on line 46

 

Eu sei que tá feia. Tipo quando comecei a desenvolver eu não tinha tido a cadeira de banco de dados ainda ai modelei de forma feia o meu banco. Usei a primeira forma normal na tabela "user_admin" que é onde ficam os cadastros dos usuários e nela botei um campo setor do tipo string. Mas quando tive a cadeira no curso técnico, vi que eu deveria ter criado uma tabela para este fim e só botar a FK na do user.

Enfim não fiz assim e o System já tá implementado na Web e já tem registros no banco. Não dá pra voltar atrás. mas serviu muito de experiência.

 

Mas agora eu preciso gerar relatórios.

 

A tabela helps é a seguinte :

 

CREATE TABLE `helps`
(
`id_helps` INT NOT NULL AUTO_INCREMENT,
`id_user_fk` INT NOT NULL,
`assunto` VARCHAR (60) NOT NULL,
`mensagem` MEDIUMTEXT NOT NULL,
`hora` TIME NOT NULL,
`data` DATE NOT NULL,
PRIMARY KEY (`id`) 
)
ENGINE = INNODB	

 

todos os chamados além de irem pra caixa de entrada do admin serão inseridas aqui. Onde não poderão ser excluídas e nem alteradas. Esta tabela é para relatórios.

 

A tabela user_admin :

 

CREATE TABLE `user_admin`
(
`id` INT NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR (50) NOT NULL,
`complete_name` VARCHAR (120) NOT NULL,
`setor` VARCHAR (120) NOT NULL,
`email` VARCHAR (100) NOT NULL,
`pass` VARCHAR (15) NOT NULL,
PRIMARY KEY (`id`) 
)
ENGINE = INNODB

Não tá dando certo da maneira que to fazendo. Alguma outra?

Abraço, e agradeço a ajuda brother.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só mais uma coisa.

testei agora fazendo individual.

assim:

$x = mysql_query("SELECT
user_admin.id,
user_admin.setor,
helps.id_user_fk
FROM user_admin INNER JOIN helps ON user_admin.id = helps.id_user_fk AND user_admin.setor = 'SUPERINTENDÊNCIA'") or die(mysql_error());
$quant = mysql_num_rows($x);
print "
<tr>
<td>SUPERINTENDÊNCIA</td>
<td>$quant</td>
</tr>";

assim deu certo. E mostrou a quantidade.

Mas imagina eu com 22 setores. Fazer isso 22 vezes. "Repetição de código até umas horas".

Como poderei melhorar isso dentro das condições do sistema? Vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

com calma.. o mysql_num_rows() vai falhar, se tiver um erro de sintaxe (ou conexão, entre outros), na tua query.

 

 

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\helpdesk\adm\resultado_por_setor.php on line 46

 

execute as tuas queries assim:

mysql_query( $sql )or die( mysql_error() );
vai te mostrar o motivo, de ter chego um false para o num_rows()

 

bom, tirando isso, então quer dizer que você não tem uma tabela setor. ne?!

 

roda a query só assim:

SELECT
        user_admin.id,
        user_admin.setor,
        helps.id_user_fk
        FROM user_admin INNER JOIN helps ON user_admin.id = helps.id_user_fk ORDER BY user_admin.setor
e procure organizar com IFs dentro do laço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php

$x = mysql_query("SELECT 
user_admin.id,
user_admin.setor, 				
helps.id_user_fk 
FROM user_admin INNER JOIN helps ON user_admin.id = helps.id_user_fk") or die(mysql_error());
$quant = mysql_num_rows($x);
while ($linha = mysql_fetch_array($x)){
print " 
<tr>
<td>$linha[setor]</td> 		
<td>AQUI EU QUERO MOSTRAR O NUMERO DE CHAMADOS</td> 	
</tr>";} 
?>

Esse código mostra o setor informatica 2 vezes porque existem 2 chamados.

Agora quero mostrar o nome do setor 1 só vez. E ao lado mostrar o numero de chamados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

putz cara...

 

com subquery:

SELECT setor, ( SELECT COUNT(`id_helps`) FROM helps WHERE helps.id_user_fk = user_admin.id ) AS qnt_helps FROM user_admin
a saida vai ser algo do tipo:

setor qnt_helps

Medico 1

Pediatrico 2

Teste 1

Mostrando registros 0 - 2 (3 total, Consulta levou 0.0003 segundos)

 

com INNER JOIN (lento)

SELECT setor, COUNT(id_helps) AS qnt_helps FROM `user_admin` INNER JOIN helps ON user_admin.id = helps.id_user_fk GROUP BY setor
saída:

setor qnt_helps

Medico 1

Pediatrico 2

Teste 1

Mostrando registros 0 - 2 (3 total, Consulta levou 0.0006 segundos)

 

só consegui pensar nessas 2 formas...

 

mas ai tenho uma pergunta:

cada linha do user_admin possui um unico setor exclusivo ?

ou você pode ter lá..

TABLE user_admin

id, nome, setor

1 - Paulo - Informática

2 - João - Informática

3 - Cicera - Contabilidade

?

se for assim, a tua modelagem está incorreta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

putz cara...

 

com subquery:

SELECT setor, ( SELECT COUNT(`id_helps`) FROM helps WHERE helps.id_user_fk = user_admin.id ) AS qnt_helps FROM user_admin
a saida vai ser algo do tipo:

 

setor qnt_helps

Medico 1

Pediatrico 2

Teste 1

Mostrando registros 0 - 2 (3 total, Consulta levou 0.0003 segundos)

 

com INNER JOIN (lento)

SELECT setor, COUNT(id_helps) AS qnt_helps FROM `user_admin` INNER JOIN helps ON user_admin.id = helps.id_user_fk GROUP BY setor
saída:

setor qnt_helps

Medico 1

Pediatrico 2

Teste 1

Mostrando registros 0 - 2 (3 total, Consulta levou 0.0006 segundos)

 

só consegui pensar nessas 2 formas...

 

mas ai tenho uma pergunta:

cada linha do user_admin possui um unico setor exclusivo ?

ou você pode ter lá..

TABLE user_admin

id, nome, setor

1 - Paulo - Informática

2 - João - Informática

3 - Cicera - Contabilidade

?

se for assim, a tua modelagem está incorreta.

 

 

Isso! Como eu falei, eu utilizei aprimeira forma normal, que o campo setor ficar na tabela de usuário. Pelta terceira forma normal eu deveria ter criado uma tabela só para setor. mas o System ja ta implantado e conta como experiencia.

Está da maneira a qual você falou :

 

1- JOAO - INFORMATICA

2- MARIA - RH

3- MARCOS - SUPERINTENDENCIA

4- ANTONIO - ADMINISTRAÇÃO

 

VLw cara, vou tentar aki. Se der vou ficar mto feliz.

vou Tentar.

JAja posto os resultados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hm... Aconteceu o seguinte

 

user_admin

 

id nome setor

1 JOAO INFORMATICA

2 MARIA Dep.Serviços Gerais

3 ANTONIO Dir. Administrtivo Financeira

4 MARCOS INFORMATICA

5 JOANA INFORMATICA

6 KENNEDY INFORMATICA

 

 

quando eu usei:

 

$x = mysql_query("SELECT user_admin.setor, ( SELECT COUNT(`id_helps`) 
FROM helps WHERE helps.id_user_fk = user_admin.id ) AS qnt_helps FROM user_admin");

 

mandei imprimir "setor e qnt_helps" e

ele mostrou isso:

 

Setor Chamados

INFORMATICA 0

DEPT DE SERVIÇOS GERAIS 1

DIR ADMINISTRATIVO - FINANCEIRA 0

INFORMÁTICA 1

INFORMÁTICA 0

INFORMÁTICA 1

 

Só quem fez chamados foi gente de DEP.SER.GERAIS e INFORMATICA, sendo que duas pessoas de informatica fizeram chamados. E Mostra. MAs ele exibe o nome varias vezes.

QUeria que mostrasse só uma vez o nome do setor. E depois a quantidade.

Abraço. Agradeço muito a ajuda. Mas ainda não ta dando certo.

 

 

=/

Compartilhar este post


Link para o post
Compartilhar em outros sites

^_^

 

então cara, taca o GROUP BY user_admin.setor

no final da query.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mandei imprimir "setor e qnt_helps" e

ele mostrou isso:

 

ESTA AKI EH DEPOIS De USAR GROUP BY

 

Setor Chamados

DEPT DE SERVIÇOS GERAIS 3 //Correto

DIR ADMINISTRATIVO - FINANCEIRA 3 //Correto

INFORMATICA 0

INFORMÁTICA 1

 

Funciona! Mas tem algo errado com o INFORMATICA ele repete duas vezes e ainda mostra o valor errado!

Eu tenho 2 chamados de informática. Mas mostra da maneira que está acima. =/

 

Até quando não existem nenhum chamado de nenhum setor ele mostra assim:

 

Setor Chamados

DEPT DE SERVIÇOS GERAIS 0

DIR ADMINISTRATIVO - FINANCEIRA 0

INFORMATICA 0

INFORMÁTICA 0

Compartilhar este post


Link para o post
Compartilhar em outros sites

este é o problema de estar usando a modelagem incorreta :lol:

 

exporte essas 2 tabelas com os dados ai, pra análise.

Compartilhar este post


Link para o post
Compartilhar em outros sites

abre o arquivo com o bloco de notas

botão direito > abrir com > notepad (bloco de notas)

 

Ctrl+C, clica em [Responder] dá Ctrl+V

 

e 'Responder'(enviar) de novo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

HELPS

-- phpMyAdmin SQL Dump -- version 3.2.4 -- http://www.phpmyadmin.net -- -- Servidor: localhost -- Tempo de Geração: Nov 09, 2010 as 10:08  -- Versão do Servidor: 5.1.41 -- Versão do PHP: 5.3.1  SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";   /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; 
-- -- Banco de Dados: `helpdesk` --  -- --------------------------------------------------------  -- -- Estrutura da tabela `helps` --  
CREATE TABLE IF NOT EXISTS `helps` (   `id_helps` int(11) NOT NULL AUTO_INCREMENT,   `id_user_fk` int(11) NOT NULL,   `assunto` varchar(60) NOT NULL,   `mensagem` mediumtext NOT NULL,   `hora` time NOT NULL,   `data` date NOT NULL,   PRIMARY KEY (`id_helps`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;  -- -- Extraindo dados da tabela `helps` --   /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

 

USER_ADMIN

-- phpMyAdmin SQL Dump
-- version 3.2.4
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tempo de Geração: Nov 09, 2010 as 10:09 
-- Versão do Servidor: 5.1.41
-- Versão do PHP: 5.3.1

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Banco de Dados: `helpdesk`
--

-- --------------------------------------------------------

--
-- Estrutura da tabela `user_admin`
--

CREATE TABLE IF NOT EXISTS `user_admin` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `user_name` varchar(30) NOT NULL,
 `complete_name` varchar(50) NOT NULL,
 `setor` varchar(120) NOT NULL,
 `email` varchar(100) NOT NULL,
 `pass` varchar(15) NOT NULL,
 `nivel` varchar(5) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=16 ;


/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

 

aki está o que você me pediu!

 

Ow galera Seria possível alguem me ajuda?

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.