¿Cuáles son las formas de obtener amigos mutuos en un (1, 2) (2, 1) escenario de la amistad?

StackOverflow https://stackoverflow.com//questions/9663607

  •  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

¿Fue útil?

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";
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top