¿Cuáles son las formas de obtener amigos mutuos en un (1, 2) (2, 1) escenario de la amistad?
-
12-12-2019 - |
Pregunta
Estoy desarrollando un sitio web en el que cuando una persona agrega a otra persona como amiga, se crean 2 entradas.Digamos que uid 1
agrega uid 2
como amigo, las siguientes filas se crean en MySQL.
activity_id uid1 uid2
1 1 2
2 2 1
uid 2
se convierte en amigos con uid 3
:
activity_id uid1 uid2
1 1 2
2 2 1
3 2 3
4 3 2
¿Cuáles son las formas de obtener los amigos mutuos entre uid 1
y uid 2
?Estoy usando PHP y MySQL sin experiencia de PDO (por ahora).
[editar]
Está bien, así que decidí organizar / normalizar las tablas.La relación solo genera 1 fila ahora.lo que hace la tabla:
activity_id uid1 uid2
1 1 2
2 2 3
Solución
Mirando el formato de la tabla desde su otra pregunta, esto debería hacer lo que quiera;
SELECT name FROM users u
JOIN friends f1
ON u.uid = f1.uid OR u.uid = f1.fid
JOIN friends f2
ON u.uid = f2.uid OR u.uid = f2.fid
WHERE (f1.uid=1 OR f1.fid=1) AND (f2.uid=3 OR f2.fid=3)
AND u.uid<>1 AND u.uid<>3;
DEMO aquí .
Otros consejos
Suponiendo que ha llamado a su mesa 'amigos'.
Esta consulta encontrará amigos comunes para los usuarios 1 y 3.
SELECT a.uid2
FROM friends a
INNER JOIN friends b
ON a.uid2 = b.uid2
WHERE a.uid1 = 1
AND b.uid1 = 3
¿No crees que podría ser un poco presuntuoso para hacer 2 filas sin embargo?Tal vez uid 2 no le gusta realmente uid 1?(OTY).
Para encontrar todos los amigos comunes de uid 1
y uid 2
:
SELECT t1.uid2
FROM tbl t1
JOIN tbl t2 USING (uid2)
WHERE t1.uid1 = 1
AND t2.uid1 = 2;
Sin embargo, Hay un caso especial, sin embargo: esta consulta no muestra si GRANCOCODICETGCODE & GENACODICETADODODOTE SON AMIGOS!
Por cierto, su diseño parece un poco redundante.Debe trabajar con una sola entrada por amistad.(Sin embargo, esta consulta tendría que adaptarse para eso.)
Básicamente, este es otro caso de la división relacional .Hay muchas maneras diferentes de pelar este gato. Encuentre bastante bajo esta pregunta relacionada - Incluyendo pruebas de rendimiento y más información.
Consulta para una pregunta actualizada
Ahora solo hay 1 fila por amistad: un usuario puede aparecer en cualquiera de las columnas:
SELECT uid
FROM (
SELECT uid2 AS uid FROM tbl WHERE uid1 = 1
UNION ALL
SELECT uid1 FROM tbl WHERE uid2 = 1
) u1
JOIN (
SELECT uid2 AS uid FROM tbl WHERE uid1 = 2
UNION ALL
SELECT uid1 FROM tbl WHERE uid2 = 2
) u2 USING (uid)
$query="SELECT distinct(uid2) FROM `test` where uid1=$uid union select distinct(uid1) from test where uid2=$uid";