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

MySQL-forespørgsel til fælles venner

Nå, den eneste forespørgsel, der måske virker indtil nu, er Simons... men det er virkelig overkill - sådan en kompleks grim forespørgsel (2 underforespørgsler med 2 fagforeninger!) for så simpel ting, at du skal placere en dusør? :-) Og hvis du har mere end 1000 brugere, vil forespørgslen være langsom som fanden - husk, den er kvadratisk, og på grund af fagforeninger i underforespørgsler ville der næsten ikke blive brugt noget indeks!

Jeg vil foreslå at genoverveje designet igen og tillade 2 duplikerede rækker til et venskab:

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

Du tror måske, at det er ineffektivt, men efter forenkling vil det gøre det muligt at omskrive forespørgslen til simple joins:

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'

som vil være hurtig som helvede! (Glem ikke at tilføje indekser for Person1,2.) Jeg har anbefalet en lignende forenkling (omskrivning underforespørgsler til joins) i andre meget ubehagelige datastrukturer, og det har fremskyndet forespørgslen fra evighed til blitz-øjeblik!

Så det, der kunne have set ud som en stor overhead (2 rækker for ét venskab), er faktisk en stor optimering :-)

Det vil også gøre forespørgsler som "find alle venner af X" meget nemmere. Og der skal ikke bruges flere dusører :-)



  1. Joomla:Ringehjælperfunktion inde fra en model?

  2. Opdater MySQL-tabel ved hjælp af CSV-fil

  3. slette den sidste række i en tabel ved hjælp af sql-forespørgsel?

  4. Indsæt et tidsstempel i databasen via ContentValues