¿Cómo ordenar por conteo con postgresql?
-
05-07-2019 - |
Pregunta
Tengo dos tablas:
Companies: (id, name, city)
Workers: (id, name)
Me gustaría obtener todas las empresas y ordenarlas por número de empleados.
El resultado debería dar:
count | company id | company name | city
------------------------------------------
90 6 foo corp NY
45 9 bar corp LA
0 3 foobar corp HO
Intenté:
select
c.*,
count(w.id) as c
from
companies c
left join
workers w
on
c.id = w.company_id
group by
c.id
order by
c desc;
Pero eso no funciona, ya que también me dice que agrupe por g.name: /
¿Alguna idea?
Solución
Has alias la tabla y la columna como la misma cosa, así que no hagas eso. No es inválido, solo difícil de seguir.
De todos modos, incluya todas las columnas que está seleccionando que no son agregados en su grupo por
:
select
count(w.id) as mycount,
w.company_id,
c.company_name,
c.city
from
companies c
left join workers w on
c.id=w.company_id
group by
w.company_id,
c.company_name,
c.city
order by mycount desc;
Otros consejos
Pruebe esto como una subconsulta:
SELECT C.*
FROM
(
SELECT C.Id, C.Company_Name, C.City, COUNT(W.Id) AS CNT
FROM Companies C
LEFT JOIN Workers W ON W.Company_Id = C.Id
GROUP BY C.Id, C.Company_Name, C.City
) T
ORDER BY T.CNT
Si no desea que se devuelva el resultado del recuento (debido a un marco ORM más o menos), puede aplicarlo directamente en el orden de la cláusula:
select
c.*
from
companies c
left join
workers w
on
c.id = w.company_id
group by
c.id
order by
count(w.id) desc;
Probado en postgreSQL 11
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow