Jump to content
Peaceandlove

Campos iguais

Recommended Posts

Peaceandlove

Preciso da vossa ajuda se poderem ajudar.

Tenho um programa em que o utilizador digita valores numa tabela e noutra tabela, (estou a fazer um horário e necessito que me compare os dois horários e me retorne apenas os dados que forem iguais. Não todos

Obrigado.

Share this post


Link to post
Share on other sites
M6

Não compreendo. A informação está numa tabela de base de dados ou numa tabela em memória?


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
Peaceandlove

Está numa tabela da base de dados.

Eu explico melhor.

Estou a fazer um horário em java que o utilizador insere nos textfields a sua disponibilidade, o mesmo acontece com o aluno, por fim estou a criar um formulário que compare os dados do professor e do aluno e que me mostre apenas os dados iguais, para saber que ali eles podem ter aulas.

Cumps

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Assim sendo, parece-me que a tua dúvida tem mais a ver com SQL...

Share this post


Link to post
Share on other sites
Peaceandlove

Os campos são grandes pois é um horário cada text field corresponde a um campo mas cá vai:

Este é da tabela horarioc:

idhorarioc, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, qa1, qa2, qa3, qa4, qa5, qa6, qa7, qa8, qa9, qa10, qa11, qa12, qi1, qi2, qi3, qi4, qi5, qi6, qi7, qi8, qi9, qi10, qi11, qi12, se1, se2, se3, se4, se5, se6, se7, se8, se9, se10, se11, se12, sa1, sa2, sa3, sa4, sa5, sa6, sa7, sa8, sa9, sa10, sa11, sa12, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, cliente_idcliente

E este da tabela horariop:

idhorariop, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, qa1, qa2, qa3, qa4, qa5, qa6, qa7, qa8, qa9, qa10, qa11, qa12, qi1, qi2, qi3, qi4, qi5, qi6, qi7, qi8, qi9, qi10, qi11, qi12, se1, se2, se3, se4, se5, se6, se7, se8, se9, se10, se11, se12, sa1, sa2, sa3, sa4, sa5, sa6, sa7, sa8, sa9, sa10, sa11, sa12, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, professor_idprofessor

Os dados são iguais o unico que muda são as chaves primárias e externas.

Cumps

Share this post


Link to post
Share on other sites
Rechousa

Então, o que pretendes é que:

- todos os campos (s1, s2, s3... até d12) da tabela horarioc sejam iguais aos campos da tabela horariop, é isso?

É uma query grande pa caraças, mas dá para fazer.

SELECT * FROM dbo.horarioc C
   INNER JOIN dbo.horariop P ON C.s1 = P.s1 AND C.s2 = P.s2 AND C.s3 = P.s3 ................... AND C.d11 = P.d11 AND C.d12 = P.d12

É isto que pretendes? Espero ter ajudado.


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
KTachyon

E que tal uma tabela com as horas ou com um enum, uma tabela com pessoas, e uma tabela (entidade fraca) que associa as horas com as pessoas. Até podes ter só o enum nessa tabela e fazer a relação directamente. Por exemplo, assumindo que tens os IDs de ambas as pessoas e tens a tabela 'pessoa_hora' que relaciona a hora com o id da pessoa, podes ir buscar as correspondências assim:

SELECT hora FROM pessoa_hora WHERE pessoa_id = $id_aluno AND hora IN (SELECT hora FROM pessoa_hora WHERE pessoa_id = $id_professor)

(Coloquei os $ para indicar que são variáveis que vêm de algum lado)


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Aconselhava-te a leitura de umas coisinhas sobre base de dados...

Confesso que até me assustei quando vi os teus campos, parece quase um parágrafo do "Lorem ipsum" ! lool

Mas é só uma opinião/conselho :P

Share this post


Link to post
Share on other sites
M6

Não é por nada, mas a ver esse modelo de dados cheira-me que essas colunas todas na verdade deviam ser linhas...

Isso não está normalizado pois não?


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
Peaceandlove

Boas obrigado a todos pelas respostas:

@Rechousa

Esse código que me mostraste vai apenas mostrar os dados que serão iguais certo?

Quero que compare os campos e me mostre quais são os que estão iguais.

E apenas me mostre esses.

@KTachyon

Eu já tenho um horário que e da disponibilidade para o professor e para o aluno ...

Só quero comparar os dados de um e do outro, porque também preciso do horario da disponibilidade.

@Lfscoutinho

Não és o único que já me disse isso :P

Nunca tinha feito nada disso mas não sabia outra maneira para fazer.

@M6

Não, este modelo não está normalizado.

Share this post


Link to post
Share on other sites
M6

Foi o que me pareceu.

Aconselho-te vivamente a teres um modelo de dados "decente", caso contrário vais ter em mãos um problema de enorme complexidade sem necessidade.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
Peaceandlove

Pois o probelma é esse, mas como é que eu num horário, vou conseguir por isso normalizado ?

Cada campo que existe desde das 9h até as 21h * 7 dias da semana tem de ser um campo na tabela ...

Share this post


Link to post
Share on other sites
M6

Pois o probelma é esse, mas como é que eu num horário, vou conseguir por isso normalizado ?

Cada campo que existe desde das 9h até as 21h * 7 dias da semana tem de ser um campo na tabela ...

Não, não tem.

Tens uma tabela com os seguintes campos: chave do horário, hora inicio, hora fim.

Isso define-te um horário, por exemplo:

1, 09:00, 10:00

2, 10:00, 11:00

3, 09:30, 11:00

etc. (metes ai todos os horários que necessitas)

Depois noutra tabela metes os dias da semana: chave do dia, descrição.

Por exemplo:

1, 'SEGUNDA';

2, 'TERÇA';

etc..

Por fim crias os horários juntando ambas as tabelas com mais informação que necessites: turma, disciplina, dia da semana, horário.

Por exemplo, para dizeres que a turma 1 tem aulas de português à terças e quintas das 9 às 10 basta ter:

1, 'Português', 1, 3, 1;

1, 'Português', 1, 4, 1;


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
KTachyon

Boas obrigado a todos pelas respostas:

@Rechousa

Esse código que me mostraste vai apenas mostrar os dados que serão iguais certo?

Quero que compare os campos e me mostre quais são os que estão iguais.

E apenas me mostre esses.

@KTachyon

Eu já tenho um horário que e da disponibilidade para o professor e para o aluno ...

Só quero comparar os dados de um e do outro, porque também preciso do horario da disponibilidade.

@Lfscoutinho

Não és o único que já me disse isso ;)

Nunca tinha feito nada disso mas não sabia outra maneira para fazer.

@M6

Não, este modelo não está normalizado.

A questão aqui é: o que tens já está em produção, ou ainda é um projecto em desenvolvimento?

Se está em desenvolvimento, estás sempre em posição de poder alterar com vista a que, no futuro, não tenhas que andar a implementar milagres para conseguir adicionar funcionalidades ao sistema que foi desenvolvido inicialmente. A manutenção é sempre uma coisa a ter em conta quando se desenvolve um projecto. :P

Se está em produção, há situações em que mais vale reestruturar num projecto novo. Até porque podes sempre portar os dados para outra representação numa base de dados.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Peaceandlove

Ainda está em Produção ...

É um projecto para a PAP 12º ano de Informática

Share this post


Link to post
Share on other sites
Peaceandlove

Tentei fazer com o inner join mas ele não está retornando nenhum valor, so retorna um que é quando todos os campos são iguais.

Share this post


Link to post
Share on other sites
Peaceandlove

          s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12

Tab 1:  x  x                          x                x           

Tab 2:  x            x                      x          x      x

Ele devia apenas retornar o s1 e o s11 mas não retorna nada, so retorna quando os campos coincidem todos.

Share this post


Link to post
Share on other sites
KTachyon

Então ainda está em desenvolvimento, não em produção. Em produção significa que já é um sistema em utilização em que os dados não podem ser simplesmente removidos.

Eu, se fosse a ti, faria como eu ou como o M6 disse, que, para além de facilitar o processo de desenvolvimento. Se não queres complicar demasiado com a adição de demasiadas tabelas e relações, utilizar uma tabela com a enumeração representativa das horas deverá bastar, mas que fique ciente que em projectos de vida real deves sempre desenvolver a pensar no futuro (mas de forma racional, não é preciso exagerar) e não a pensar apenas no que é preciso actualmente.

Até porque, segundo a tua organização dos dados nas tabelas, os selects que queres fazer não correspondem a dados, mas sim às colunas em que os dados correspondem. Sinceramente, nem sei se há suporte para tal coisa, e a única solução pedires os valores de todas as colunas e fazeres a comparação manual com código. Um exemplo:

SELECT * FROM horarios WHERE user_id = id_do_aluno OR user_id = id_do_professor

//$campos = array('s1', 's2', 's3', 's4',... completar...
// o * devia ser substituído pelos valores do array separados por vírgulas, para fácil manutenção, mas a título de exemplo:
$query = "SELECT * FROM horarios WHERE user_id = ".$id_do_aluno." OR user_id = ".$id_do_professor;

$resultado_1 = mysql_fetch_array($result);
$resultado_2 = mysql_fetch_array($result);

foreach ($campos as $i => $valor) {
    $campo_actual = $valor;

    if ($resultado_1[$campo_actual] == 1 && $resultado_2[$campo_actual] == 1)
        echo $campo_actual." é compatível";
}

Existe, de facto uma instrução que te permite obter as colunas de uma base de dados, que podes utilizar aqui para criar o array:

SHOW COLUMNS FROM horarios

Que eu tenha conhecimento, não consegues ir buscar as colunas onde, para determinados IDs, só devolve as cujos valores sejam X e iguais entre si. Pode ser que esteja errado e que alguém o demonstre e te ajude, mas, como podes ver, a diferença de teres a base de dados estruturada dessa forma é que terás que resolver esse problema de formas menos ortodoxas.

EDIT: E, pior, é que pelos vistos tens mesmo duas tabelas de horários, o que significa que tens que fazer a query a duas tabelas e comparar os resultados de duas tabelas diferentes. Se um dia alguma coisa muda e tens que adicionar mais uma coluna para cada dia (imaginando que, entretanto, há mais uma hora possível), ou se passarem também a haver aulas ao sábado, significa que tens que adicionar as novas colunas em duas tabelas diferentes, coisa que apesar de não parecer complicado, quem pode vir a fazer a manutenção do teu código, (ou mesmo tu, muitos anos depois) pode estar sujeito a levar mais tempo a relembrares a situação...


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
M6

          s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12

Tab 1:  x  x                          x                x           

Tab 2:  x            x                      x          x      x

Ele devia apenas retornar o s1 e o s11 mas não retorna nada, so retorna quando os campos coincidem todos.

O que são todos esses S?

São linhas?

Nota: um inner join vai retornar apenas linhas de ambas as tabelas quando há um match entre as condições especificadas.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
Peaceandlove

Obrigado KTachyon vou seguir  o teu conselho.

M6 esses S's são as colunas que tenho, ainda não normalizei a base de dados.

Share this post


Link to post
Share on other sites
M6

Obrigado KTachyon vou seguir  o teu conselho.

M6 esses S's são as colunas que tenho, ainda não normalizei a base de dados.

Então aconselho-te vivamente a parares o que estás a fazer e normalizares o modelo, caso contrário nunca vais conseguir fazer o que queres como deve ser e com um custo baixo...


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.