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

MySQL-forespørgsel for at finde venner og antallet af fælles venner

Fælles venner kan findes ved at tilslutte sig friend_links-tabellen til sig selv i friend_id-feltet sådan:

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

Men husk på, at dette i det værste tilfælde i det væsentlige er kvadratisk antallet af rækker i friend_links-tabellen og kan ret nemt hæve din server, når du har et ikke-trivielt antal rækker. En bedre mulighed ville være at bruge 2 underforespørgsler for hver bruger og derefter slutte sig til resultaterne af disse.

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

Du kan også forenkle din friend_links-tabel ved at fjerne surrogatnøglen link_id og laver bare (user_id,friend_id) den primære nøgle, da de alligevel skal være unikke.

Rediger:

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

Jeg tænker også, at user_id begrænsninger kan flyttes fra WHERE klausul i JOIN betingelser for at reducere størrelsen af ​​datasættet, der er oprettet af selv-join og udelukke brugen af ​​underforespørgsler som i mit andet eksempel.



  1. Mønstermatchning:Mere sjov, da jeg var barn

  2. Minimal logning med INSERT...SELECT i tomme grupperede tabeller

  3. Trimning af mere transaktionslogfedt

  4. Varchar-problem på Mysql 2147483647