Relacionamento entre 3 tabelas - fazer no mysql(RESOLVIDO)
É 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.
Relacionamento entre 3 tabelas - fazer no mysql(RESOLVIDO)
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'
Relacionamento entre 3 tabelas - fazer no mysql(RESOLVIDO)
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)
Relacionamento entre 3 tabelas - fazer no mysql(RESOLVIDO)
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.
Relacionamento entre 3 tabelas - fazer no mysql(RESOLVIDO)
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...
Relacionamento entre 3 tabelas - fazer no mysql(RESOLVIDO)
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]
Relacionamento entre 3 tabelas - fazer no mysql(RESOLVIDO)
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!
Relacionamento entre 3 tabelas - fazer no mysql(RESOLVIDO)
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
Citação:
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 :)