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
ASes solo ruido para alias de tabla. Pero no lo omita de los alias de columna. El manual sobre "Omitir la palabra clave AS":En
FROMelementos, tanto el estándar como PostgreSQL permitenASomitirse 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 LASTclá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 BYcomo 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 sintaxisUSINGen la cláusula de unión. Otra característica estándar de SQL. Efecto secundario de bienvenida:user_idsolo 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.