sql >> Databasteknik >  >> RDS >> PostgreSQL

Fråga till ORDER BY antalet rader som returneras från en annan SELECT

Postgres sätt att göra detta:

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
  • Nyckelordet AS är bara brus för tabellalias. Men utelämna det inte från kolumnalias. Manualen om "Utelämna AS-nyckelordet":

    I FROM objekt, både standarden och PostgreSQL tillåter AS ska utelämnas före ett alias som är ett oreserverat nyckelord. Men detta är opraktiskt för namn på utdatakolumner, på grund av syntaktiska oklarheter .

    Djärv betoning min.

  • ISNULL() är en anpassad förlängning av MySQL eller SQL Server. Postgres använder SQL-standardfunktionen COALESCE() . Men du behöver inte heller här. Använd NULLS LAST klausul istället, som är snabbare och renare. Se:

    • PostgreSQL sortera efter datetime asc, null först?
  • Flera användare kommer att ha samma antal vänner. Dessa kamrater skulle sorteras godtyckligt. Upprepad körning kan ge en annan sorteringsordning, vilket vanligtvis inte är önskvärt. Lägg till fler uttryck i ORDER BY som tiebreaker. I slutändan löser primärnyckeln eventuell återstående oklarhet.

  • Om de två tabellerna delar samma kolumnnamn user_id (som de borde) kan du använda syntaxgenvägen USING i anslutningsklausulen. En annan standard SQL-funktion. Välkommen bieffekt:user_id är bara listad en gång i utgången för SELECT * , till skillnad från när du går med med ON . Många klienter skulle inte ens acceptera dubbletter av kolumnnamn i utdata.



  1. Hur man säkerhetskopierar/återställer MySQL/MariaDB och PostgreSQL med hjälp av verktygen "Automysqlbackup" och "Autopostgresqlbackup"

  2. SQL-handledning för nybörjare

  3. DatabaseError:aktuell transaktion avbröts, kommandon ignoreras till slutet av transaktionsblocket?

  4. OracleParameter och IN-klausul