sql >> Databasteknik >  >> RDS >> Mysql

MySQL-fråga för att hitta vänner och antal gemensamma vänner

Gemensamma vänner kan hittas genom att gå med i tabellen friend_links till sig själv i fältet friend_id så här:

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 tänk på att detta, i värsta fall, i grunden är kvadratisk antalet rader i tabellen friend_links och kan ganska enkelt jacka upp din server när du har ett icke-trivialt antal rader. Ett bättre alternativ skulle vara att använda 2 underfrågor för varje användare och sedan slå samman resultaten av dessa.

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 också förenkla din friend_links-tabell genom att ta bort surrogatnyckeln link_id och gör bara (user_id,friend_id) primärnyckeln eftersom de ändå måste vara unika.

Redigera:

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

Jag tror också att user_id begränsningar kan flyttas från WHERE satsen i JOIN villkor för att minska storleken på datamängden som skapas av självanslutningen och utesluta användningen av underfrågor som i mitt andra exempel.



  1. Mysql-fråga problem

  2. SQL-nycklar, MUL vs PRI vs UNI

  3. Hur CHARACTER_LENGTH()-funktionen fungerar i MySQL

  4. Hur kan jag hitta vilka tabeller som refererar till en given tabell i Oracle SQL Developer?