#  > Servidores >  > Servidores de Rede >  >  Relacionamento entre 3 tabelas - fazer no mysql(RESOLVIDO)

## cvr

É o seguinte:

Tenho 3 tableas

pacientes(cod_pac) 
Procedimentos(Cod_Proc) 
Fatura(Cod_pac)
(Cod_proc) 


Preciso reunir todas essas informaçoes em uma sql para gerar um relatorio. So consigo fazer com 2 tabelas, veja o codigo:

Select Fatura.*,
pacientes.* from Fatura, pacientes
Where
Fatura.Cod_pac = pacientes.Cod_pac and
Fatura.Dt_int between '$dtini' and '$dtfim'

Até aqui tudo bem. So que preciso do valor do procedimento que esta na tabela Procedimentos. Deveria agora fazer:

Fatura.Cod_proc = Procedimentos.Cod_proc

Para pode pegar o valor la na tabela de procedimentos.

Como fazer isto ? Estou utilizando PHP.
Se desse para salvar aquela instrucao la em cima e depois utilizar ela em outra sql, desta vez usando a tabela de procedimentos para recuperar o valor de cada procedimento.
Se alguem souber como resolver, por favor da uma força.

Deseja agradeo a todos.

----------


## Marcio68Almeida

Select fa.*, pa.* , pr.*
From Fatura fa, 
Pacientes pa, 
Procedimentos pr
Where fa.cod_pac = pa.cod_pac 
And fa.cod_proc = pr.cod_proc 
And fa.dt_int between '$dtini' and '$dtfim'

----------


## Avenger

hehe isso é relacionamento?
eu faço isso direto e nem sabia! huaiheaiuea 
Esses dias eu tava até imaginando se esse 'select de acordo com outras tabelas' podia ser aquele 'misterioso relacionamento' do ms-access, que mostrava um risquinho de uma tabela prá a outra, mas que nada acontecia... hehehe (que vi há muito tempo atrás, antes de ter access 97)

----------


## wps

Relacionamento entre tabelas corresponde a acoes que uma tabela filha sofre quando ha alterações em tabelas pais exemplo.

tabela empresa (pai)
tabela funcionario(filha) --> dentro desta tabela eu tenho um campo chamado 

empresa_cod que é relacionado a empresa.empresa.cod

KEY `codigo_empresa` (`empresa_cod`),
CONSTRAINT `fk_funcionario_01` FOREIGN KEY (`codigo_empresa`) REFERENCES `empresa` (`empresa_cod`) ON DELETE CASCADE ON UPDATE CASCADE

Neste trecho acima a tabela funcioarios fica ligada a tabela empresa portanto é impossivel colocar dentro da tabela funcionarios um cliente que tenha um codigo de empresa que nao existe.

E caso vc deletasse uma empresa todos os seus funcionarios seriam deletados em escala.

----------


## cvr

Ai marcos. Isso nao funciona. Acho que o mysql so trabalho com 2 tabelas na
clausula where. Quando executo desta forma ai... nao e listado nada. Quando tiro uma das tabelas o sistema lista. Ja havia tentado isto, inclusive em outras situacoes.

Mas valeu pela dica.

----------


## Marcio68Almeida

CVR... 
Imagino que o Marcos seja eu (Márcio)... mas vamos em frente... :cry: 
Se você faz a consulta com as 3 tabelas não retorna, pode ser duas coisas :
1. Uma das tabelas não tem valores que satisfaçam a condição da cláusula WHERE.
2. Uma das colunas que compõe a cláusula WHERE não é campo chave, isto é, não faz o relacionamento entre as tabelas...

WPS...
O que você explicou está 100% correto, trata-se das Foreing Keys, que aparecem como os "tracinhos" no access (lembrando que access não é banco de dados, no máxim um bando de dados... risos...

----------


## cvr

Nao quero tomar seu tempo. Mas ja que vc esta disponivel, vai ai o que realmente estou fazendo.Vai as tabelas que estou trabalhando, tudo muito simples.

mysql> show tables;
+-----------------------+
| Tables_in_Faturamento |
+-----------------------+
| Fatura |
| Proc |
| paciente |
| tmp |
+-----------------------+
4 rows in set (0.01 sec)

mysql> desc Fatura;
+----------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+----------------+
| Id | int(16) | | PRI | NULL | auto_increment |
| Cod_proc | char(16) | YES | | NULL | |
| Cod_pac | int(16) | YES | | NULL | |
| Origem | char(60) | YES | | NULL | |
| Dt_trans | date | YES | | NULL | |
| Dt_int | date | YES | | NULL | |
| Cm | char(3) | YES | | NULL | |
| Cp | char(3) | YES | | NULL | |
| Cc | char(3) | YES | | NULL | |
| C_obs | char(3) | YES | | NULL | |
+----------+----------+------+-----+---------+----------------+
10 rows in set (0.00 sec)

mysql> Desc Proc;
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| Id | int(16) | | PRI | NULL | auto_increment |
| Codigo | char(16) | YES | | NULL | |
| Descricao | char(60) | YES | | NULL | |
| Data | date | YES | | NULL | |
| Valor | double(16,2) | YES | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> Select Cod_pac,Cod_proc from Fatura;
+---------+----------+
| Cod_pac | Cod_proc |
+---------+----------+
| 125 | 21245 |
| 325 | 21245 |
| 456 | 21245 |
| 430 | 236 |
| 431 | 325 |
| 123 | 325 |
| 95 | 321 |
| 473 | 321 |
| 474 | 321 |
| 475 | 321 |
| 4 | 124411 |
| 25 | 12124454 |
| 4 | 124411 |
| 25 | 12124454 |
| 25 | 12124454 |
| 261 | 112141 |
| 221 | 112141 |
| 3 | 36654 |
+---------+----------+
18 rows in set (0.02 sec)

mysql> select * from Proc;
+----+--------+-------------+------------+--------+
| Id | Codigo | Descricao | Data | Valor |
+----+--------+-------------+------------+--------+
| 15 | 001254 | CIRURGIA | NULL | 125.00 |
| 16 | 325100 | PARTO | 0000-00-00 | 252.00 |
| 17 | 4580 | PARTO | 0000-00-00 | 22.00 |
| 18 | 3251 | PARTO COMUM | 0000-00-00 | 253.00 |
| 19 | 45852 | INTERNAÇÃO | 2005-10-27 | 458.00 |
+----+--------+-------------+------------+--------+
5 rows in set (0.00 sec)

mysql> select Cod_pac, Nome from paciente;
+---------+----------------------------------------+
| Cod_pac | Nome |
+---------+----------------------------------------+
| 125 | LIDIANE DE SOUZA FERREIRA |
| 325 | JAIME MANOEL CARVALHO |
| 456 | VANDILMA ALVES CARDOSO |
| 457 | SANDRA NERES VIEIRA |
| 458 | GERALDA OLIVEIRA ALVES |
| 459 | JUSSARA DIANE C. FERREIRA |
| 460 | PAULO ADILSON OLIVEIRA |
| 461 | REGIANE APARECIDA SOUZA FERREIRA |
| 462 | JONATHAN FRANCISCO DA CRUZ |
| 463 | ALCIMAR APARECIDA RIBEIRO |
| 464 | CLAUDIANA PEREIRA DE SOUZA |
| 465 | ADAO ADELINO AZEVEDO |
| 466 | MARIA HELENA TEIXEIRA |
| 467 | GERALDA CAMARGO SANTOS |
| 468 | MICHAEL RIBEIRO ANDRADE |
| 469 | MARCO ANTONIO JUNIO LOPES |
| 470 | IVONE APARECIDA DE SOUZA |
| 471 | JOSE CARDOSO DAS NEVES |
| 472 | ELISANGELA DARLING DE OLIVEIRA |
| 473 | ELISMAR FERREIRA FONSECA |
| 474 | JENNIFER MARIA PEREIRA FONSECA |
| 475 | MARIA NEUZELY CARDOSO |
+---------+----------------------------------------+
473 rows in set (0.00 sec)

mysql> 
Elimine alguns pacientes para nao ficar muito grande.

Agora veja a minha consulta que funciona, mas com a sua nao retorna registros:

if($opcao == 'TODAS') {


$sqlval = "Select fa.*,
pa.*
from Fatura fa, paciente pa
where fa.Cod_pac = pa.Cod_pac 

AND 
fa.Dt_int between '$dtini' and '$dtfim' order by Nome"; 
}


CNPJ:18.803.072/0002-13
PACIENTE ORIGEM DATA PROC.DIAG CM CP CC CO VALOR
AILTON TADEU DE OLIVEIRA BOCAIUVA 25/10/2005 112141 
ANA VIEIRA DURAES GUARACIAMA 22/10/2005 325 
CIDALIA LEITE DE OLIVEIRA BOCAIUVA 22/10/2005 112141 
ELISMAR FERREIRA FONSECA GUARACIAMA 22/10/2005 321 X 
GIRLENE APARECIDA SILVA SOUZA BOCAIUVA 25/10/2005 124411 X 
GIRLENE APARECIDA SILVA SOUZA BOCAIUVA 27/10/2005 124411 
JAIME MANOEL CARVALHO OLHOS D'AGUA 25/10/2005 21245 X 
JENNIFER MARIA PEREIRA FONSECA GUARACIAMA 22/10/2005 321 
LIDIANE DE SOUZA FERREIRA OLHOS D'AGUA 25/10/2005 21245 X 
MARCIA HELOISA P. CARVALHO FC.DUMONT 23/10/2005 236 X 
MARIA JOSE FERREIRA

Com sua consulta:
if($opcao == 'TODAS') {

Select fa.*, pa.* , pr.*
From Fatura fa,
paciente pa,
Proc pr
Where fa.cod_pac = pa.cod_pac
And fa.cod_proc = pr.codigo
And fa.dt_int between '$dtini' and '$dtfim'
}

RETORNA:
CNPJ:18.803.072/0002-13
PACIENTE ORIGEM DATA PROC.DIAG CM CP CC CO VALOR
[/b]

----------


## cvr

Desculpe ai amigo! So agora observei que realmente existe um erro da gravação dos codigos de procedimentos. Pois os mesmos não estão sendo validados como deveriam ser no cadastro de Procedimentos.
Realmente funciona mesmo. Somente percebi isto agora, e graças a vc. Valeu mesmo e desculpe ai pelos transtornos. Na ancia de resolver o problema a gente acaba fazendo coisas precipitadas.


Um abraço!

----------


## Marcio68Almeida

A melhor coisa quando a casa está caindo, é levantar, ir tomar uma água ou um café, respirar fundo e rever o processo...
Isso costuma funcionar na maior parte das vezes...
:clap:

----------


## Avenger

Hum! To aki prá defender a posição do amigo que falou que 'sim, dá prá fazer a consulta em mais de duas tabelas, sim'. Desde que elas tenham uma 'relação' (sem ser a que o wps falou) entre elas. Tipo:
Tabela a tenha 'id', tabela b tenha um 'a_id' que coincida com o campo 'id' da tabela a, e a tabela 'c' tenha um 'b_id' (preferencialmente) ou um 'a_id' (gera um pouco de confusão). daí os where's constariam algo como
where b.a_id=a.id and c.b_id=b.id :P

Xeu ver agora a tabelinha do dono do tópico:
Já vi que no caso do fatura.cod_pa e paciente.cod_pa, nem todos os campos 'batem'. Por exemplo, o alguns apenas batem, e o restante aparentemente não há mais, na tabela pacientes 'cod_pa's que batam com a fatura.cod_pa.
Daí apenas uma lista parcial deve retornar num select onde pacientes.cod_pa=fatura.cod_pa. Como foi o resultado que você nos exibiu. (por exemplo, o do cod_pa=460 (Paulo Adilson) não apareceu, certo?

Agora prá a segunda comparação, relevando-se que a lista já está 'reduzida' devido à primeira condição, vamos verificar um teste em
*fatura.cod_proc=proc.codigo* e ignorar aquelas datas:
Olhando no conteúdo de sua 'fatura' e 'proc', quem se 'relaciona' (não um relacionamento de banco de dados, mas nossa relação 'lógica', que nos permite dar o select e pegar ítens das duas tabelas).
não existe, na tabela *proc*, nenhum código _21245, ou 236 ou 325_, mas sim _001254, 325100, 4580..._. Portanto, para nenhum ítem *cod_proc* da tabela 'fatura' existe um *codigo* na tabela 'Proc' que seja igual ao da primeira tabela. Portanto, em nenhuma hipótese será exibido um ítem com essa condição, uma vez que ela nunca será satisfeita.

Em outras palavras, enquanto você não adaptar os códigos para baterem com 'cod_proc', você não vai obter retorno. Além disso, você precisa consertar os cod_pa da tabela fatura para conter todos os códigos dos pacientes (e os respectivos códigos do serviço prestado a eles) para que 




> para cada paciente na tabela 'Pacientes', exista uma correspondência na tabela 'Fatura'.


Igualzinho a enunciado de Matemática! :P

Espero ter exibido com clareza qual é o problema  :Smile:

----------

