Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytanie MySQL o wspólnych znajomych

Cóż, jedyne zapytanie, które może działać do tej pory, to zapytanie Simona… ale to prawdziwa przesada — tak złożone, paskudne zapytanie (2 podzapytania z 2 związkami!) dla tak prostej rzeczy, że musisz wyznaczyć nagrodę? :-) A jeśli masz ponad 1000 użytkowników, zapytanie będzie powolne jak diabli - pamiętaj, jest kwadratowe, a ze względu na związki w podzapytaniach prawie żaden indeks nie zostanie użyty!

Proponuję ponownie przemyśleć projekt i zezwolić na 2 zduplikowane wiersze na przyjaźń:

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

Możesz pomyśleć, że to nieefektywne, ale następujące uproszczenie pozwoli przepisać zapytanie do prostych złączeń:

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'

co będzie szybkie jak diabli! (Nie zapomnij dodać indeksów dla Person1,2.) Zaleciłem podobne uproszczenie (przepisanie podzapytania do złączeń) w innej bardzo nieprzyjemnej strukturze danych i przyspieszyło to zapytanie od wieczności do błyskawicznej błyskawicy!

Więc to, co mogło wyglądać na duże obciążenie (2 wiersze na jedną przyjaźń), jest w rzeczywistości dużą optymalizacją :-)

Ponadto znacznie ułatwi to zapytania typu „znajdź wszystkich znajomych X”. I nie trzeba wydawać więcej nagród :-)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jakiej funkcji użyć do haszowania haseł w MySQL?

  2. Wypełnianie wielu tabel w ormie linii wodnej żagli

  3. Wstawianie posta w Wordpress za pomocą MySql

  4. Dane grupy MySQL według czasu

  5. Wybierz wiele sum za pomocą zapytania MySQL i wyświetl je w osobnych kolumnach