Postgres způsob, jak to udělat:
SELECT *
FROM users u
LEFT JOIN (
SELECT user_id, count(*) AS friends
FROM friends
) f USING (user_id)
ORDER BY f.friends DESC NULLS LAST, user_id -- as tiebreaker
-
Klíčové slovo
ASje jen šum pro aliasy tabulek. Ale nevynechejte to z aliasů sloupců. Manuál "Vynechání klíčového slova AS":V
FROMpoložky, standard i PostgreSQL umožňujíASbýt vynechán před aliasem, který je nevyhrazeným klíčovým slovem. To je však nepraktické pro názvy výstupních sloupců kvůli syntaktické nejednoznačnosti .Tučné zdůraznění moje.
-
ISNULL()je vlastní rozšíření MySQL nebo SQL Server. Postgres používá standardní funkci SQLCOALESCE(). Ale ani jedno zde nepotřebujete. PoužijteNULLS LASTmísto toho, což je rychlejší a čistší. Viz:- PostgreSQL řazení podle datetime asc, nejprve null?
-
Více uživatelů bude mít stejný počet přátel. Tito kolegové by byli řazeni libovolně. Opakované provádění může vést k jinému pořadí řazení, což obvykle není žádoucí. Přidejte další výrazy do
ORDER BYjako tiebreaker. Primární klíč nakonec řeší všechny zbývající nejednoznačnosti. -
Pokud obě tabulky sdílejí stejný název sloupce
user_id(jako by měli) můžete použít zkratku syntaxeUSINGve spojovací klauzuli. Další standardní funkce SQL. Uvítací vedlejší efekt:user_idje uveden pouze jednou ve výstupu proSELECT *, na rozdíl od připojení sON. Mnoho klientů by ani nepřijalo duplicitní názvy sloupců ve výstupu.