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

Zapytanie MySQL, aby znaleźć znajomych i liczbę wspólnych znajomych

Wzajemnych znajomych można znaleźć, dołączając do siebie tabelę friend_links w polu friend_id w następujący sposób:

SELECT *
FROM friend_links f1 INNER JOIN friend_links f2
  ON f1.friend_id = f2.friend_id
WHERE f1.user_id = $person1
  AND f2.user_id = $person2

Pamiętaj jednak, że w najgorszym przypadku jest to zasadniczo kwadrat liczba wierszy w tabeli friend_links i może dość łatwo podkręcić twój serwer, gdy masz nietrywialną liczbę wierszy. Lepszą opcją byłoby użycie 2 podzapytań dla każdego użytkownika, a następnie dołączenie ich wyników.

SELECT *
FROM (
  SELECT *
  FROM friend_links
  WHERE user_id = $person1
) p1 INNER JOIN (
  SELECT *
  FROM friend_links
  WHERE user_id = $person1
) p2
  ON p1.friend_id = p2.friend_id

Możesz także uprościć tabelę friend_links, usuwając klucz zastępczy link_id i po prostu robię (user_id,friend_id) klucz podstawowy, ponieważ i tak muszą być unikalne.

Edytuj:

SELECT f2.user_id, COUNT(*) 'friends_in_common'
FROM friend_links f1 LEFT JOIN friend_links f2
  ON f1.friend_id = f2.friend_id
WHERE f1.user_id = $person
GROUP BY f2.user_id
ORDER BY friends_in_common DESC
LIMIT $number

Myślę też, że user_id ograniczenia można przenieść z WHERE klauzulę w JOIN warunki w celu zmniejszenia rozmiaru zbioru danych utworzonego przez samodołączenie i wykluczenie użycia podzapytań, jak w moim drugim przykładzie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę zrzucić bazę danych MySQL bez użycia mysqldump w Pythonie?

  2. Jak pobrać niepasujące wyniki w mysql

  3. ustawianie globalnego trybu sql_mode w mysql

  4. Co to są zasoby nr?

  5. Sqoop:Nie można załadować wyjątku sterownika mysql