sql >> Databáze >  >> RDS >> PostgreSQL

Dotaz na ORDER BY počet řádků vrácených z jiného SELECT

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 SQL COALESCE() . Ale ani jedno zde nepotřebujete. Použijte NULLS 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 syntaxe USING ve spojovací klauzuli. Další standardní funkce SQL. Uvítací vedlejší efekt:user_id je uveden pouze jednou ve výstupu pro SELECT * , na rozdíl od připojení s ON . Mnoho klientů by ani nepřijalo duplicitní názvy sloupců ve výstupu.



  1. Obnovení / aktualizace obrazovky formuláře v Oracle D2k Forms 6i

  2. Jak vytvořit vypočítaný sloupec v SQLite

  3. MySQL DATEDIFF() vs TIMESTAMPDIFF():Jaký je rozdíl?

  4. Uspořádejte uzly TreeView přetažením