sql >> Database >  >> RDS >> Mysql

MySQL Query om vrienden en aantal gemeenschappelijke vrienden te vinden

Wederzijdse vrienden kunnen worden gevonden door als volgt deel te nemen aan de tabel friend_links voor zichzelf in het friend_id-veld:

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

Maar onthoud dat dit, in het ergste geval, in wezen kwadraat is het aantal rijen in de tabel friend_links en kan je server vrij gemakkelijk opkrikken als je een niet-triviaal aantal rijen hebt. Een betere optie zou zijn om 2 subquery's voor elke gebruiker te gebruiken en dan de resultaten daarvan samen te voegen.

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

U kunt uw tabel friend_links ook vereenvoudigen door de surrogaatsleutel link_id te verwijderen en maak gewoon (user_id,friend_id) de primaire sleutel omdat ze toch uniek moeten zijn.

Bewerken:

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

Ik denk ook dat de user_id beperkingen kunnen worden verplaatst van de WHERE clausule in de JOIN voorwaarden om de grootte van de gegevensset die door de self-join is gemaakt, te verkleinen en het gebruik van subquery's uit te sluiten, zoals in mijn tweede voorbeeld.



  1. PHPExcel en tekstterugloop

  2. Wat is een Bitmap-heapscan in een queryplan?

  3. Kolomnaam Oracle-tabel met spatie

  4. voorbereide instructie waarbij waarde in array staat