sql >> Database teknologi >  >> RDS >> PostgreSQL

Forespørgsel til ORDER BY antallet af rækker returneret fra en anden SELECT

Postgres måde at gøre dette på:

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
  • Søgeordet AS er bare støj til bordaliasser. Men udelad det ikke fra kolonnealiasser. Manualen om "Udeladelse af AS-nøgleordet":

    I FROM elementer, både standarden og PostgreSQL tillader AS skal udelades før et alias, der er et ureserveret nøgleord. Men dette er upraktisk til outputkolonnenavne på grund af syntaktiske tvetydigheder .

    Fed fremhævelse mine.

  • ISNULL() er en tilpasset udvidelse af MySQL eller SQL Server. Postgres bruger SQL-standardfunktionen COALESCE() . Men du behøver heller ikke her. Brug NULLS LAST klausul i stedet, som er hurtigere og renere. Se:

    • PostgreSQL sorteres efter datetime asc, null først?
  • Flere brugere vil have det samme antal venner. Disse peers ville blive sorteret vilkårligt. Gentagen udførelse kan give en anden sorteringsrækkefølge, hvilket typisk ikke er ønskeligt. Tilføj flere udtryk til ORDER BY som tiebreaker. I sidste ende løser den primære nøgle enhver resterende tvetydighed.

  • Hvis de to tabeller deler det samme kolonnenavn user_id (som de burde) kan du bruge syntaksgenvejen USING i tilslutningsklausulen. En anden standard SQL-funktion. Velkommen bivirkning:user_id er kun opført én gang i outputtet for SELECT * , i modsætning til når du tilslutter dig med ON . Mange klienter ville ikke engang acceptere duplikerede kolonnenavne i outputtet.



  1. Sådan laver du en LEFT ANTI SEMI JOIN i SQL Server

  2. Sådan vælger du ved hjælp af WITH RECURSIVE-sætning

  3. Sådan nummereres rækker i SQL

  4. Få Short Day Name i SQL Server (T-SQL)