thiagogoiis Posted May 8, 2012 Report Share Posted May 8, 2012 (edited) Tenho que fazer uma consulta no seguinte banco.Estudante (ID, nome, serie)Amigo (ID1, ID2) -> simétrica, ou seja, ID1 é amigo de ID2 então, ID2 é amigo de ID1Gosta (ID1, ID2) -> assimétrica, ou seja, se ID1 gosta de ID2 não necessariamente ID2 gosta de ID1Então, o que e preciso é o seguinte:Busca nome e serie de todos os casos em que ambas pessoas se gostam, ou seja, se ID1 gosta de ID2 então, ID2 gosta de ID1. Eliminando o par duplicado.A busca que eu gerei foi a seguinte:SELECT E1.NOME, E1.SERIE, E2.NOME, E2.SERIEFROM ESTUDANTE E1, ESTUDANTE E2, GOSTA G1, GOSTA G2WHERE E1.ID = G1.ID1 AND E2.ID = G1.ID2 AND E1.ID = G2.ID2 AND E2.ID = G2.ID1Com essa busca o resultado que obtive foi:Gabriel - 9 - Cassandra - 9Cassandra - 9 - Gabriel - 9Alexis - 11 - Kyle - 12Kyle - 12 - Alexis - 11O resultado que eu necessito é:Gabriel - 9 - Cassandra - 9Alexis - 11 - Kyle - 12Ou seja, o que preciso é apenas remover o par mas, eu não estou conseguindo de nenhuma maneira que eu saiba.Ajudem-me.Grato desde já. Edited May 8, 2012 by thiagogoiis Quote Link to comment Share on other sites More sharing options...
0 fulvio Posted May 8, 2012 Report Share Posted May 8, 2012 Bom dia thiagogoiis, Desculpe pela pergunta... mas isso é trabalho de faculadade / Curso? :) Quote Link to comment Share on other sites More sharing options...
0 thiagogoiis Posted May 8, 2012 Author Report Share Posted May 8, 2012 Bom dia thiagogoiis, Desculpe pela pergunta... mas isso é trabalho de faculadade / Curso? :)Foi um trabalho.É que é assim, foram quase 20 questões numa prova prática. Da semana passada. Esse foi um dos exercícios que eu não consegui fazer.Quando pedi para meu professor me falar como fazer ele, ele me disse que queria que eu pesquisasse.Então, eu já consegui fazer todos os outros exercícios. Porém, esse foi o único que fiquei sem saber. Já pedi ajuda à quase todos os meus colegas de sala e eles me disseram que não estavam conseguindo fazer esse exercício.Não estou postando aqui sem pesquisar.Eu gosto do desafio mas, esse exercício, eu não estou conseguindo fazer.P.S.: Igual eu disse, e mostrei, formulei uma consulta. Não estou fazendo corpo mole. Só que com o que eu sei, não consigo tirar essa linha duplicada, só isso.Se você não quiser me dar a resposta me guie para uma referência onde me mostre como proceder com o problema. Por favor.Grato. Quote Link to comment Share on other sites More sharing options...
0 fulvio Posted May 8, 2012 Report Share Posted May 8, 2012 Boa tarde Thiago, rs... sem problemas. Pergunto porque não costumo ajudar pessoas q estão fazendo faculdade ou curso. Muitos postam trabalhos e esperam soluções fáceis... rs (não estou falando de vc). Pois bem... tenho uma dúvida: como deve ser a resolução deste exercício? Apenas 1 select? Ou pode fazer do jeito q quiser? OBS.: A linha não se encontra duplicada. Perceba que os dados estão misturados. Para o sql, as linhas são distintas. Quote Link to comment Share on other sites More sharing options...
0 fulvio Posted May 8, 2012 Report Share Posted May 8, 2012 Fiz um exemplo logo abaixo. Criei as temporárias e fiz os testes (está comentado). Dê uma olhada. Caso seja isto e não entenda, posta aí q explico passo a passo:-- criar temporária CREATE TABLE #Estudante (Id INT, nome VARCHAR(20), Serie int) CREATE TABLE #Gosta (Id1 INT, Id2 INT) -- inserção dos dados INSERT INTO #Estudante VALUES (1, 'Gabriel', 9) INSERT INTO #Estudante VALUES (2, 'Cassandra', 9) INSERT INTO #Estudante VALUES (3, 'Alexis', 11) INSERT INTO #Estudante VALUES (4, 'Kyle', 12) INSERT INTO #Gosta values(1, 2) INSERT INTO #Gosta values(2, 1) INSERT INTO #Gosta values(3, 4) INSERT INTO #Gosta values(4, 3) -- select para conferir os dados SELECT * FROM #Estudante SELECT * FROM #Gosta -- seu select, utilizando os dados inseridos na temporária SELECT E1.NOME, E1.SERIE, E2.NOME, E2.SERIE FROM #ESTUDANTE E1, #ESTUDANTE E2, #GOSTA G1, #GOSTA G2 WHERE E1.ID = G1.ID1 AND E2.ID = G1.ID2 AND E1.ID = G2.ID2 AND E2.ID = G2.ID1 -- Meu select SELECT E1.NOME, E1.SERIE, E2.NOME, E2.SERIE FROM #ESTUDANTE E1, #ESTUDANTE E2, #GOSTA G WHERE E1.Id=G.Id1 AND E2.Id=G.Id2 and E1.id IN (SELECT MIN(ID1) FROM #GOSTA GROUP BY ID1*ID2 HAVING COUNT (ID1*ID2)>1) Quote Link to comment Share on other sites More sharing options...
0 thiagogoiis Posted May 9, 2012 Author Report Share Posted May 9, 2012 A sugestão do Fulvio funcionou para resolver o meu problema e depois de muito quebrar a cabeça também consegui elaborar uma outra consulta que retornou uma pesquisa do jeito que eu queria.SELECT E1.NOME, E1.SERIE, E2.NOME, E2.SERIEFROM ESTUDANTE E1, ESTUDANTE E2, GOSTA G1, GOSTA G2WHERE E1.ID = G1.ID1 AND E2.ID = G1.ID2 AND E1.ID = G2.ID2 AND E2.ID = G2.ID1 AND E1.NOME < E2.NOMEFaltava somente a parte que garantia que um dado nome só seria apresentado se ele fosse menor que o da segunda coluna.Obrigado. Quote Link to comment Share on other sites More sharing options...
0 fulvio Posted May 9, 2012 Report Share Posted May 9, 2012 rs... com a nova informação "nome só seria apresentado se ele fosse menor que o da segunda coluna" ai fica fácil!!! Gostei do exercício Thiago. Dá pra quebrar a cabeça com ele. Sem esta informação que passou, não teria como fazer sem subselect. Pede pro professor retirar esta informação e refazer o exercício. Um bom exercício! Qualquer dúvida que tiver, estamos ai... Quote Link to comment Share on other sites More sharing options...
Question
thiagogoiis
Tenho que fazer uma consulta no seguinte banco.
Estudante (ID, nome, serie)
Amigo (ID1, ID2) -> simétrica, ou seja, ID1 é amigo de ID2 então, ID2 é amigo de ID1
Gosta (ID1, ID2) -> assimétrica, ou seja, se ID1 gosta de ID2 não necessariamente ID2 gosta de ID1
Então, o que e preciso é o seguinte:
Busca nome e serie de todos os casos em que ambas pessoas se gostam, ou seja, se ID1 gosta de ID2 então, ID2 gosta de ID1. Eliminando o par duplicado.
A busca que eu gerei foi a seguinte:
SELECT E1.NOME, E1.SERIE, E2.NOME, E2.SERIE
FROM ESTUDANTE E1, ESTUDANTE E2, GOSTA G1, GOSTA G2
WHERE E1.ID = G1.ID1 AND E2.ID = G1.ID2 AND E1.ID = G2.ID2 AND E2.ID = G2.ID1
Com essa busca o resultado que obtive foi:
Gabriel - 9 - Cassandra - 9
Cassandra - 9 - Gabriel - 9
Alexis - 11 - Kyle - 12
Kyle - 12 - Alexis - 11
O resultado que eu necessito é:
Gabriel - 9 - Cassandra - 9
Alexis - 11 - Kyle - 12
Ou seja, o que preciso é apenas remover o par mas, eu não estou conseguindo de nenhuma maneira que eu saiba.
Ajudem-me.
Grato desde já.
Edited by thiagogoiisLink to comment
Share on other sites
6 answers to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.