+ Responder ao Tópico



  1. #1

    Padrão 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.

  2. #2

    Padrão 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'

  3. #3
    Avenger
    Visitante

    Padrão 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)

  4. #4

    Padrão Opa tem mais coisa ai

    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.

  5. #5

    Padrão 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.

  6. #6

    Padrão 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...

  7. #7

    Padrão 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]

  8. #8

    Padrão 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!

  9. #9

    Padrão CVR...

    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:

  10. #10
    Avenger
    Visitante

    Padrã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

    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