Domanda

Sto sviluppando un sito web in cui una persona aggiunge un'altra persona come amico, vengono create 2 voci.Diciamo che uid 1 aggiunge uid 2 come amico, le seguenti righe vengono create in MySQL.

activity_id   uid1 uid2
     1         1     2
     2         2     1
.

uid 2 diventa amici con uid 3:

activity_id   uid1 uid2
     1         1     2
     2         2     1
     3         2     3
     4         3     2
.

Quali sono i modi per ottenere gli amici reciproci tra uid 1 e uid 2?Sto usando PHP e MySQL senza esperienza PDO (per ora).

[modifica] Ok, quindi ho deciso di organizzare / normalizzare i tavoli.La relazione genera solo 1 riga ora.che rende il tavolo:

activity_id   uid1 uid2
     1         1     2
     2         2     3
.

È stato utile?

Soluzione

Guardando il formato della tabella dal tuo Altre domande, questo dovrebbe fare ciò che vuoi;

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 qui .

Altri suggerimenti

Supponendo che tu abbia definito i "amici" del tavolo.

Questa query troverà amici comuni per gli utenti 1 e 3.

SELECT a.uid2
  FROM friends a
    INNER JOIN friends b
       ON a.uid2 = b.uid2
  WHERE a.uid1 = 1
   AND b.uid1 = 3
.

Non pensi che potrebbe essere un po 'presuntuoso per rendere 2 righe però?Forse UID 2 non piace davvero UID 1?(OTY).

Per trovare tutti gli amici comuni di uid 1 e uid 2:

SELECT t1.uid2
FROM   tbl t1
JOIN   tbl t2 USING (uid2)
WHERE  t1.uid1 = 1
AND    t2.uid1 = 2;
.

C'è un caso speciale, però: questa query non mostra se 1 & 2 sono amici!

BTW, il tuo design sembra un po 'ridondante.Dovrebbe funzionare con una sola voce per amicizia.(Questa query dovrebbe essere adattata per questo, però.)

Fondamentalmente questo è un altro caso di Divisione relazionale .Ci sono molti modi diversi per la pelle questo gatto. Trova abbastanza in questa domanda correlata - compresi i test di prestazione e ulteriori informazioni.


.

Query per domanda aggiornata

Ora c'è solo 1 riga per amicizia: un utente può aprire in entrambe le colonne:

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";
.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top