Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

xhicco

[Resolvido] Busca de amigos em comum igual ao orkut

Recommended Posts

olá a todos eu gostaria de saber como crio a sintaxe sql de amigos em comum similar ao que tem no orkut, estou desenvolvendo um site em asp com mysql esta ficando bom mas esta sintaxe esta me deixando louco pois nao estou conseguindo monta-la alguem pode me ajudar?

 

ai vao as especificações:

no banco de dados tenho a seguinte estrutura:

 

tabela membros

 

uid - autonumeraçao(este tb é o uid do usuario)

nome

sobrenome

foto

etc

 

------------------------------------------------

 

tabela amigos

 

id - autonumeraçao

para - este é o id de quem o usuario quer add

de - este é o id de que adicionou

 

------------------------------------------------

 

agora é o seguinte tenho a pagina perfil

nesta pagina se eu estiver na pagina de uma pessoa qualquer e se nos tivermos amigos em comum devera mostra-la nesta pagina

 

por exemplo se meu uid é 19 e estou na pagina da pessoa com uid 20 e se ambos somos amigos de 30 devera mostrar no perfil do 20 que somos amigos em comum de 30 entenderam?

 

obs: para buscar meu uid eu recupero de uma session

Session("uid_usuario") = rs("uid")

 

e para recuperar o uid do perfil da pessoa eu recupero de uma querystring

ficando assim http://meusite/perfil.asp?uid=20

 

se alguem puder me ajudar a montar esta string SQL eu ficaria muito grato obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

como assim exemplo nas tabelas? =/

ai em cima eu ja expliquei que ha duas tabelas...

a tabela "membros" e a tabela "amigos"

eu gostaria de buscar só os amigos em comum de dois usuarios similar ao do orkut...

a busca de amigos de um determinado usuario eu ja consegui montar vejam a string:

 

strSQL="SELECT amigos.para,amigos.de,membros.uid,membros.nome,membros.foto,membros.hora_login FROM membros STRAIGHT_JOIN amigos ON membros.uid = amigos.para and amigos.para <> '" & uid & "' or membros.uid = amigos.de and amigos.de <> '" & uid & "' where amigos.para = '" & uid & "' or amigos.de = '" & uid & "' ORDER BY hora_login DESC"

 

agora preciso fazer uma busca de amigos em comum entre dois usuarios entendem?

sopondo como disso de se meu uid é 19 e o uid da pessoa que estou visitando é 80 e nós dois somos amigos de 30 deve aparecer na pagina de perfil de 80 que somos amigos de 30 sacaram?

 

sendo que no banco de dados esta assim:

tabela membros:

uid nome

19 Xhicco

84 Andreé

30 Marina

 

tabela amigos:

id de para

1 84 30

2 30 19

 

percebem que 19 e 80 sao amigos de 30?

como eu montaria a string para fazer esta busca... lembrando que tem que rolar um inner entre essas duas tabelas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

nao tem q rolar inner de nada....

 

select de from
(
select de, para from amigos
UNION
select para,de from amigos
)z
group by de having group_concat(para) IN (19,84)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Procure a SqlMagazine nº 38 tem um artigo sobre como criar uma rede tipo Orkut que pode lhe ser útil , tem uma base de teoria.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mas giesta tem que ter um join pois eu busco alguns valores na tabela membros... como o uid,nome,sobrenome do usuario a foto... etc entendeu? e outra coisa...

nesta parte da string que você me passou "group by de having group_concat(para) IN (19,84)" como eu colocaria esses dois usuarios no IN

poderia ser assim "group by de having group_concat(para) IN ("'& uid &'","'& usuario &'")"

ou eu teria que montar um array? o complicado é que nao sei montar array =/

 

ainda nao testei esta string vou testa-la depois posto ak o resultado.. ok?

e motta o que seria essa "SqlMagazine nº 38" é uma revista? tem como encontrar na net? se nao for pedir muito se vcs puderem me passar algum link eu ficaria agradecido pois é só isto que falta para eu montar meu sistema...

abraço a todos...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao mota eu nao sou assinante desta revista... gostaria de algum exemplo mesmo pratico... nao quero que ninguem faça o dever de casa pra mim... mas algumas orientacoes seria de grande valia...

Compartilhar este post


Link para o post
Compartilhar em outros sites

xhicco eu nunca implementei algo semelhante, lembrei deste assunto pois o artigo me pareceu legal na época e tempos depois respondi tópico semenhante aqui (este assunto parece bombar).

 

As dicas que poderia te passar já o fiz , são a base matemática disto (grafos) e o artigo em questão.

 

Procure aqui no site os tópicos relativos a isso quem sabe a galera que os abriu não pode te passar mais alguma dica.

 

Boa sorte.

Compartilhar este post


Link para o post
Compartilhar em outros sites

giesta acabei de testar a string que tu me passastes e nao obtive o resultado desejado... infelizmnte nao era isso o que eu almejava =/

Compartilhar este post


Link para o post
Compartilhar em outros sites

pessoal consegui resolver a busca dos amigos em comum... consegui isso montando um array que percorre a SQL, o código segue abaixo pra quem se interessar... gostaria da opinião de vocês referente a performance do código e estrurura... dei um explain da sintaxe SQL no mysql e esta tudo perfeito ele esta usando os índices que eu criei.

 

 

tabela membros:

uid

nome

foto

hora_login

 

tabela amigos

id

amigo

 

 

o codigo:

 

este primeiro recordset busca todos os amigos de um determinado usuario e ja aproveita para montar um array:

 

<%
strSQL= "SELECT amigos.id,amigos.amigo,membros.uid,membros.nome,membros.foto,membros.hora_login FROM membros INNER JOIN amigos ON membros.uid = amigos.amigo where amigos.id ='84' ORDER BY hora_login DESC"

Set rs_ver_amigo = Server.CreateObject("ADODB.Recordset")
rs_ver_amigo.CursorLocation = 3
rs_ver_amigo.CursorType = 0
rs_ver_amigo.LockType = 1
rs_ver_amigo.Open strSQL,con
counter = rs_ver_amigo.recordcount -1
%>

<%If rs_ver_amigo.EOF Then%>
nenhum amigo
<%Else%>
<%If rs_ver_amigo.EOF Then Exit For%>
conteudo do recordset a ser exibido

 

 

<%
'aqui começa a criação do array colocando o valor do campo amigo da tabela amigos na variavel array_amig dentro do loop do recordset ou outra forma que desejar.
array_amig = array_amig & rs_ver_amigo("amigo")& ","  

end If
rs_ver_amigo.close
Set rs_ver_amigo = Nothing

'aqui se cria o array concatenando todos os resultados.
array_amig = Split(Trim(array_amig),",")
%>

 

este segundo recordset busca os amigos em comum entre dois usuarios varrendo o array

 

<%
SQL="SELECT amigos.id,amigos.amigo,membros.uid,membros.nome,membros.foto,membros.hora_login FROM membros INNER JOIN amigos ON membros.uid = amigos.amigo where amigos.id ='19' and amigos.amigo ='0' "

for i = 0 to counter
SQL = SQL & " OR amigos.id ='19' and amigos.amigo ='" & array_amig(i) & "'"
next

SQL = SQL & " ORDER BY hora_login DESC"

Set rs_ver_amigo = Server.CreateObject("ADODB.Recordset")
rs_ver_amigo.CursorLocation = 3
rs_ver_amigo.CursorType = 0
rs_ver_amigo.LockType = 1
rs_ver_amigo.Open SQL,con
counter = rs_ver_amigo.recordcount 
If rs_ver_amigo.EOF Then
Else
%> 


<%
end If
rs_ver_amigo.close
Set rs_ver_amigo = Nothing
end if
%>

OBS:este exemplo diz que o usuario com uid 19 esteja visitando o perfil do usuario com uid 84.

 

 

lembrando que o recordset não esta completo pois o que me interessa mostrar ak foi como eu montei a busca... ok?

peço aos moderadores do site que encerrem o post como resolvido e obrigado a todos que me ajudaram.

abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.