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 :)