sql >> Databáze >  >> RDS >> Mysql

Dotaz MySQL k nalezení přátel a počtu společných přátel

Vzájemné přátele lze najít připojením k tabulce friend_links k sobě samému v poli friend_id takto:

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

Ale mějte na paměti, že toto je v nejhorším případě v podstatě kvadrát počet řádků v tabulce friend_links a může docela snadno zvedat váš server, jakmile budete mít netriviální počet řádků. Lepší možností by bylo použít 2 dílčí dotazy pro každého uživatele a poté spojit výsledky z nich.

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

Také můžete zjednodušit svou tabulku friend_links odstraněním náhradního klíče link_id a stačí vytvořit (user_id,friend_id) primární klíč, protože stejně musí být jedinečný.

Upravit:

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

Také si myslím, že user_id omezení lze přesunout z WHERE klauzule do JOIN podmínky pro zmenšení velikosti datové sady vytvořené vlastním spojením a vyloučení použití poddotazů jako v mém druhém příkladu.



  1. php dotaz na zeměpisnou šířku a délku iOS nevyhledává poblíž mysql lat a lon s výstupem xml

  2. Funkce formátu data serveru SQL Server

  3. Psaní dotazu pro více tabulek v php

  4. Výzvy škálování databáze Moodle PostgreSQL