Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
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...
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)
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.
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...
Sim é uma revista de papel destas que se vendem em bancas .... :)
http://www.devmedia.com.br/post-6902-Revista-SQL-Magazine-Edicao-38.html
A base matemática disto é a Teoria dos Grafos.
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...
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.
giesta acabei de testar a string que tu me passastes e nao obtive o resultado desejado... infelizmnte nao era isso o que eu almejava =/
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
da um exemplo nas tabelas q a gente ajuda