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

MySQL dotaz pro společné přátele

No, jediný dotaz, který by zatím mohl fungovat, je Simonův... ale to je opravdu přehnané - tak složitý ošklivý dotaz (2 dílčí dotazy se 2 sjednoceními!) na tak jednoduchou věc, že ​​potřebujete umístit odměnu? :-) A pokud máte více než 1000 uživatelů, bude dotaz pekelně pomalý - pamatujte, že je kvadratický a kvůli sjednocení v poddotazech by se sotva použil žádný index!

Navrhoval bych znovu promyslet design a povolit 2 duplicitní řádky pro přátelství:

id  Person1    Person2  status
1         1          2  friend
2         2          1  friend
3         1          3  friend
4         3          1  friend

Možná si myslíte, že je to neefektivní, ale následující zjednodušení umožní přepsat dotaz na jednoduchá spojení:

select f1.Person2 as common_friend
from friends as f1 join friends as f2
    using (Person2)
where f1.Person1 = '$id1' and f2.Person1 = '$id2' 
    and f1.status = 'friend' and f2.status = 'friend'

který bude pekelně rychlý! (Nezapomeňte přidat indexy pro Osoba1,2.) Poradil jsem podobné zjednodušení (přepsání subqueries to joins) v jiné velmi nepříjemné datové struktuře a urychlilo to dotaz od věčnosti do bleskového okamžiku!

Takže to, co mohlo vypadat jako velká režie (2 řady na jedno přátelství), je ve skutečnosti velká optimalizace :-)

Také to usnadní dotazy typu „najít všechny přátele X“. A nebude potřeba utrácet žádné další odměny :-)



  1. PHP MySQL vybírá náhodné řádky

  2. Zjistěte, proč se nepodařilo odeslat e-mail na SQL Server (T-SQL)

  3. Kdy použít mysql_real_escape_string()

  4. Název tabulky byl zadán dvakrát jako cíl aktualizace a samostatný zdroj dat