Mysql Join check if given data does not exist in another table

0

TABLE "profile"

id  nome    
1   UserA   
2   UserB   
3   Usuario1    
4   Usuario2    
5   Usuario3    
6   Usuario4    

TABLE "friends"

id  amigo1  amigo2  status  
 2      3       2       1   
 4      4       1       1   
 5      2       5       1   
 6      1       5       1   
 7      6       1       0   

If I use join, to return friends, it works OK (use id = 1 / UserA as the base)

SELECT perfil.id, perfil.nome,amigos.amigo1, amigos.amigo2, amigos.status FROM perfil
INNER JOIN amigos ON ((amigos.amigo1 = perfil.id) OR (amigos.amigo2 = perfil.id))
WHERE perfil.id != 1 AND (amigos.amigo1 = 1 or amigos.amigo2 = 1) AND amigos.status = '1' GROUP BY perfil.id ORDER BY rand() LIMIT 12

Return me

id  nome     amigo1 amigo2  status  
 4  Usuario     4        1       1  
 5  Usuario3    1        5       1  

My question is, I can not return the values of those who are not friends with ID 1 / UserA

Join this way (applying in WHERE! = 1 (ID 1):

SELECT perfil.id, perfil.nome, amigos.amigo1, amigos.amigo2, amigos.status FROM perfil
INNER JOIN amigos ON ((amigos.amigo1 = perfil.id) OR (amigos.amigo2 = perfil.id)) 
WHERE perfil.id != 1 AND (amigos.amigo1 != 1 or amigos.amigo2 != 1) GROUP BY perfil.id ORDER BY rand() LIMIT 12

Results:

id  nome    amigo1  amigo2  status  
6   Usuario4    6       1       0   
5   Usuario3    2       5       1   
4   Usuario2    4       1       1   
2   UserB       3       2       1   
3   Usuario1    3       2       1   

My goal is that join does not show User3 (ID 5) in the list, as it is listed as a friend of ID 1.

    
asked by anonymous 11.07.2018 / 20:29

1 answer

0
/**
selecionar todos que nao sao amigos do id=1
**/
SELECT *
FROM perfil p
WHERE
 id!=1
AND
 id NOT IN (
 SELECT pa.id
 FROM perfil p
 JOIN amigos a ON (a.amigo1=p.id OR a.amigo2=p.id)
 JOIN perfil pa ON pa.id=IF(a.amigo1=p.id, a.amigo2, a.amigo1) 
 WHERE p.id=1
 AND a.status=1
);
    
12.07.2018 / 04:28