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
AS
je jen šum pro aliasy tabulek. Ale nevynechejte to z aliasů sloupců. Manuál "Vynechání klíčového slova AS":V
FROM
položky, standard i PostgreSQL umožňujíAS
bý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 LAST
mí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 BY
jako 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 syntaxeUSING
ve spojovací klauzuli. Další standardní funkce SQL. Uvítací vedlejší efekt:user_id
je 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.