Ir ao conteúdo
  • Cadastre-se

problema inner join em c++


Posts recomendados

To com um problema no meu código, tenho 2 medicamentos na tabela MEDICAMENTOS no MYSQL porém no codigo só to conseguindo printar os 2 primeiros

No caso eu tenho Aspirina e Xarope, porém so mostra a Aspirina

 

#ifndef BUSCAR_H_INCLUDED
#define BUSCAR_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>

void buscarID();
void buscarNome();
void buscarCPF();

void buscar(){

    int opbuscar;

    do{
        system("cls");
        cout << "\t\t\t\t\t-----------------------------------" << endl;
        cout << "\t\t\t\t\t|              BUSCAR             |" << endl;
        cout << "\t\t\t\t\t|---------------------------------|" << endl;
        cout << "\t\t\t\t\t|          1 - ID                 |" << endl;
        cout << "\t\t\t\t\t|          2 - NOME               |" << endl;
        cout << "\t\t\t\t\t|          3 - CPF                |" << endl;
        cout << "\t\t\t\t\t|          0 - VOLTAR             |" << endl;
        cout << "\t\t\t\t\t-----------------------------------" << endl;
        cout << "\t\t\t\t\tOPÇÃO: ";
        cin >> opbuscar;

        switch(opbuscar){

            case 1:
                buscarID();
            break;

            case 2:
               buscarNome();
            break;

            case 3:
               buscarCPF();
            break;

            case 0:
                return;
            break;

           default:
                cout << "OPÇÃO INVALIDA - PROGRAMA ENCERRADO" << endl;
                exit(0);
        }
    }while(opbuscar != 0);
}

void buscarID(){

    system("cls");
    int id;
    int entrar;
    int fields;

    cout << "ID: ";
    cin >> id;

    MYSQL conexao;
    MYSQL_RES* resultado;
    MYSQL_ROW linha;

    char query[1024];

    mysql_init(&conexao);

    if(mysql_real_connect(&conexao, "localhost", "root", "root", "asilo", 0, NULL, 0)){

        resultado = (mysql_store_result(&conexao));

        sprintf(query,"SELECT * FROM PACIENTE P JOIN CUIDADOR C ON C.ID_CUIDADOR = P.ID_CUIDADOR  JOIN RECEITUARIO R ON R.ID_PACIENTE = P.ID_PACIENTE JOIN MEDICACAO M ON M.ID_PACIENTE = R.ID_PACIENTE WHERE P.ID_PACIENTE = '%d'",id);
        mysql_query(&conexao, query);
        resultado = mysql_store_result(&conexao);
        entrar = mysql_num_rows(resultado);

        if(entrar >= 1){
            linha = mysql_fetch_row(resultado);

            fields = mysql_num_fields(resultado);

            system("cls");
            cout << fields;
            cout << "\t\t\t\t\t-----------------------------------" << endl;
            cout << "\t\t\t\t\t|         DADOS PACIENTE           |" << endl;
            cout << "\t\t\t\t\t-----------------------------------" << endl;
            cout << "\t\t\t\t\tID: " << linha[0] << endl;
            cout << "\t\t\t\t\tNome: " << linha[1] << endl;
            cout << "\t\t\t\t\tCPF: " << linha[2] << endl;
            cout << "\t\t\t\t\tNascimento: " << linha[3] << endl;
            cout << "\t\t\t\t\tSexo: " << linha[4] << endl;
            cout << "\t\t\t\t\tResponsavel: " << linha[5] << endl;
            cout << "\t\t\t\t\tTelefone Responsavel: " << linha[6] << endl;
            cout << "\t\t\t\t\tData de Entrada: " << linha[7] << endl;
            cout << "\t\t\t\t\tQuarto: " << linha[8] << endl << endl;

            cout << "\t\t\t\t\t-----------------------------------" << endl;
            cout << "\t\t\t\t\t|         DADOS CUIDADOR          |" << endl;
            cout << "\t\t\t\t\t-----------------------------------" << endl;
            cout << "\t\t\t\t\tID: " << linha[10] << endl;
            cout << "\t\t\t\t\tNome: " << linha[11] << endl << endl;

            cout << "\t\t\t\t\t-----------------------------------" << endl;
            cout << "\t\t\t\t\t|          RECEITUARIO            |" << endl;
            cout << "\t\t\t\t\t-----------------------------------" << endl;

            cout << "\t\t\t\t\tRemédio: " << linha[15] << endl;
            cout << "\t\t\t\t\tData: " << linha[16] << endl << endl;

            system("pause");


        }else{
            system("cls");
            cout << "\t\t\t\t\t-----------------------------------" << endl;
            cout << "\t\t\t\t\t|         NAO ENCONTRADO           |" << endl;
            cout << "\t\t\t\t\t-----------------------------------" << endl;
        }

    }else{
        printf("Falha de conexao\n");
        printf("Erro %d : %s\n", mysql_errno(&conexao), mysql_error(&conexao));
    }

    cout << endl;
    system("pause");
}

 

Link para o comentário
Compartilhar em outros sites

@Fn1X O IF ali seria pra saber se o ID que a pessoa digitou existe no banco, eu consegui fazer com while aqui, so que tive que criar mais uma tabela e agora me perdi tudo kkk, ficou assim o código o problema é que tenho 1 registro no prontuario e 2 no receituario, ai ele mostra o registro do prontuario 2 vezes, acho q o inner join ta errado

#ifndef BUSCAR_H_INCLUDED
#define BUSCAR_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>

void buscarID();
void buscarNome();
void buscarCPF();

void buscar(){

    int opbuscar;

    do{
        system("cls");
        cout << "\t\t\t\t\t-----------------------------------" << endl;
        cout << "\t\t\t\t\t|              BUSCAR             |" << endl;
        cout << "\t\t\t\t\t|---------------------------------|" << endl;
        cout << "\t\t\t\t\t|          1 - ID                 |" << endl;
        cout << "\t\t\t\t\t|          2 - NOME               |" << endl;
        cout << "\t\t\t\t\t|          3 - CPF                |" << endl;
        cout << "\t\t\t\t\t|          0 - VOLTAR             |" << endl;
        cout << "\t\t\t\t\t-----------------------------------" << endl;
        cout << "\t\t\t\t\tOPÇÃO: ";
        cin >> opbuscar;

        switch(opbuscar){

            case 1:
                buscarID();
            break;

            case 2:
               buscarNome();
            break;

            case 3:
               buscarCPF();
            break;

            case 0:
                return;
            break;

           default:
                cout << "OPÇÃO INVALIDA - PROGRAMA ENCERRADO" << endl;
                exit(0);
        }
    }while(opbuscar != 0);
}

void buscarID(){

    system("cls");
    int id;
    int entrar;
    int aux = 0;

    cout << "ID: ";
    cin >> id;

    MYSQL conexao;
    MYSQL_RES* resultado;
    MYSQL_ROW linha;

    char query[1024];

    mysql_init(&conexao);

    if(mysql_real_connect(&conexao, "localhost", "root", "root", "asilo", 0, NULL, 0)){

        resultado = (mysql_store_result(&conexao));

        sprintf(query,"SELECT * FROM PACIENTE P JOIN CUIDADOR C ON C.ID_CUIDADOR = P.ID_CUIDADOR JOIN RECEITUARIO R ON R.ID_PACIENTE = P.ID_PACIENTE JOIN MEDICACAO M ON R.ID_PACIENTE = M.ID_PACIENTE JOIN PRONTUARIO X ON X.ID_PACIENTE = P.ID_PACIENTE JOIN ATIVIDADE A ON A.ID_PACIENTE = X.ID_PACIENTE WHERE P.ID_PACIENTE = '%d'",id);
        mysql_query(&conexao, query);
        resultado = mysql_store_result(&conexao);
        entrar = mysql_num_rows(resultado);

        if(entrar >= 1){

            system("cls");

            while((linha = mysql_fetch_row(resultado))!= NULL){
                if(aux < 1){
                    cout << "\t\t\t\t\t-----------------------------------" << endl;
                    cout << "\t\t\t\t\t|         DADOS PACIENTE           |" << endl;
                    cout << "\t\t\t\t\t-----------------------------------" << endl;
                    cout << "\t\t\t\t\tID: " << linha[0] << endl;
                    cout << "\t\t\t\t\tNome: " << linha[1] << endl;
                    cout << "\t\t\t\t\tCPF: " << linha[2] << endl;
                    cout << "\t\t\t\t\tNascimento: " << linha[3] << endl;
                    cout << "\t\t\t\t\tSexo: " << linha[4] << endl;
                    cout << "\t\t\t\t\tResponsavel: " << linha[5] << endl;
                    cout << "\t\t\t\t\tTelefone Responsavel: " << linha[6] << endl;
                    cout << "\t\t\t\t\tData de Entrada: " << linha[7] << endl;
                    cout << "\t\t\t\t\tQuarto: " << linha[8] << endl << endl;

                    cout << "\t\t\t\t\t-----------------------------------" << endl;
                    cout << "\t\t\t\t\t|         DADOS CUIDADOR          |" << endl;
                    cout << "\t\t\t\t\t-----------------------------------" << endl;
                    cout << "\t\t\t\t\tID: " << linha[10] << endl;
                    cout << "\t\t\t\t\tNome: " << linha[11] << endl << endl;

                    cout << "\t\t\t\t\t-----------------------------------" << endl;
                    cout << "\t\t\t\t\t|          PRONTUÁRIO             |" << endl;
                    cout << "\t\t\t\t\t-----------------------------------" << endl;
                    cout << "\t\t\t\t\tAtividade: " << linha[21] << endl;
                    cout << "\t\t\t\t\tData: " << linha[22] << endl << endl;

                    cout << "\t\t\t\t\t-----------------------------------" << endl;
                    cout << "\t\t\t\t\t|          RECEITUÁRIO            |" << endl;
                    cout << "\t\t\t\t\t-----------------------------------" << endl;
                    cout << "\t\t\t\t\tRemédio: " << linha[15] << endl;
                    cout << "\t\t\t\t\tData: " << linha[16] << endl << endl;

                }else{
                    cout << "\t\t\t\t\tRemédio: " << linha[15] << endl;
                    cout << "\t\t\t\t\tData: " << linha[16] << endl << endl;
                }

                aux ++;
            }

        }else{
            system("cls");
            cout << "\t\t\t\t\t-----------------------------------" << endl;
            cout << "\t\t\t\t\t|         NAO ENCONTRADO           |" << endl;
            cout << "\t\t\t\t\t-----------------------------------" << endl;
        }

    }else{
        printf("Falha de conexao\n");
        printf("Erro %d : %s\n", mysql_errno(&conexao), mysql_error(&conexao));
    }

    cout << endl;
    system("pause");
}

 

Link para o comentário
Compartilhar em outros sites

para tirar a duvida se seu select está errado mesmo faça um teste diretamente no banco

 

rode ele lá 

 

citação

select * 
from paciente p 
join cuidador c on c.id_cuidador = p.id_cuidador 
join receituario r on r.id_paciente = p.id_paciente 
join medicacao m on r.id_paciente = m.id_paciente 
join prontuario x on x.id_paciente = p.id_paciente 
join atividade a on a.id_paciente = x.id_paciente 
where p.id_paciente = '%d'

 

todas essas ligações existem para ambos os resultados? faça um teste com left join em cada uma para ter certeza

Link para o comentário
Compartilhar em outros sites

Nao entendi muito o INNER JOIN, mas na meu pensamento nao deveria aparecer o nome do remédio 2x pois só tenho 3 cadastrados e ta mostrando ele 6x ali

Queria mostrar todos os dados do paciente, do seu respectivo cuidador, dos medicamentos que ele tomou e das atividades que ele fez.

To tentando com JOIN se eu nao conseguir vou fazer os SELECTS com WHERE mesmo

Link para o comentário
Compartilhar em outros sites

o inner join mostra a combinação de todos que atendem a especificação.

No caso desse print ele mostra o nome do remédio 2 vezes porque o paciente fez 2 atividades diferentes. 

E para cada combinação (paciente, cuidador, medicamentos, atividades e prontuarios que obedeçam o inner join) ele mostra uma linha.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Daria o mesmo resultado. Mas pelo que você disse está certo

Citação

Queria mostrar todos os dados do paciente, do seu respectivo cuidador, dos medicamentos que ele tomou e das atividades que ele fez.

 

Ou você queria por exemplo mostrar igual essa imagem?

 

Se for, acho que teria que usar uma lógica via programa, onde você não imprime o que não quer. Via SQL vai voltar todas as linhas mesmo.

 

Outra coisa que pode fazer é tirar a tabela atividades desse select, daí você mostra todos os dados (menos as atividades) e depois mostra as atividades fazendo junção só com a tabela de paciente.

sssssssssssssss.png

adicionado 3 minutos depois

Bom, eu nunca usei SQL com C++, então não entendo o que aqueles linha[indice] guardam, mas não seria mais fácil ler uma tabela por vez sem junção? 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!