sql >> Base de Datos >  >> RDS >> PostgreSQL

Consulta a ORDER BY el número de filas devueltas de otro SELECT

La forma Postgres de hacer esto:

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
  • La palabra clave AS es solo ruido para alias de tabla. Pero no lo omita de los alias de columna. El manual sobre "Omitir la palabra clave AS":

    En FROM elementos, tanto el estándar como PostgreSQL permiten AS omitirse antes de un alias que sea una palabra clave no reservada. Pero esto es poco práctico para los nombres de las columnas de salida, debido a las ambigüedades sintácticas .

    Énfasis en negrita mío.

  • ISNULL() es una extensión personalizada de MySQL o SQL Server. Postgres usa la función estándar de SQL COALESCE() . Pero no necesitas ninguno aquí. Usa el NULLS LAST cláusula en su lugar, que es más rápido y más limpio. Ver:

    • Ordenar PostgreSQL por fechahora asc, ¿null primero?
  • Varios usuarios tendrán el mismo número de amigos. Estos pares se ordenarían arbitrariamente. La ejecución repetida puede generar un orden de clasificación diferente, lo que normalmente no es deseable. Agregue más expresiones a ORDER BY como desempate. En última instancia, la clave principal resuelve cualquier ambigüedad restante.

  • Si las dos tablas comparten el mismo nombre de columna user_id (como deberían) puede usar el atajo de sintaxis USING en la cláusula de unión. Otra característica estándar de SQL. Efecto secundario de bienvenida:user_id solo aparece una vez en la salida para SELECT * , a diferencia de cuando se une con ON . Muchos clientes ni siquiera aceptarían nombres de columna duplicados en la salida.