Quali sono i modi per ottenere amici reciproci in un (1, 2) (2, 1) Scenario di amicizia?
-
12-12-2019 - |
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
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";
.