Mysql
 sql >> Database >  >> RDS >> Mysql

Query MySQL per amici comuni

Bene, l'unica query che potrebbe funzionare fino ad ora è quella di Simon... ma è davvero eccessivo:una query così complessa e sgradevole (2 sottoquery con 2 unioni!) Per una cosa così semplice che devi piazzare una taglia? :-) E se hai più di 1000 utenti, la query sarà lenta da morire - ricorda, è quadratica e, a causa delle unioni nelle sottoquery, non verrebbe utilizzato quasi nessun indice!

Suggerirei di ripensare di nuovo il design e consentire 2 righe duplicate per un'amicizia:

id  Person1    Person2  status
1         1          2  friend
2         2          1  friend
3         1          3  friend
4         3          1  friend

Potresti pensare che sia inefficiente, ma la seguente semplificazione consentirà di riscrivere la query in join semplici:

select f1.Person2 as common_friend
from friends as f1 join friends as f2
    using (Person2)
where f1.Person1 = '$id1' and f2.Person1 = '$id2' 
    and f1.status = 'friend' and f2.status = 'friend'

che sarà veloce come l'inferno! (Non dimenticare di aggiungere gli indici per Person1,2.) Ho consigliato una semplificazione simile (riscrittura subquery a join) in un'altra struttura di dati molto sgradevole e ha velocizzato la query dall'eternità all'istante!

Quindi quello che avrebbe potuto sembrare un grande sovraccarico (2 righe per un'amicizia) è in realtà una grande ottimizzazione :-)

Inoltre, renderà molto più semplici query come "trova tutti gli amici di X". E non dovrai più spendere taglie :-)