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 permitenAS
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 SQLCOALESCE()
. Pero no necesitas ninguno aquí. Usa elNULLS 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 sintaxisUSING
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 paraSELECT *
, a diferencia de cuando se une conON
. Muchos clientes ni siquiera aceptarían nombres de columna duplicados en la salida.