Comment trier par nombre avec postgresql?
-
05-07-2019 - |
Question
J'ai deux tables:
Companies: (id, name, city)
Workers: (id, name)
Je voudrais obtenir toutes les entreprises et les trier par nombre d'employés.
Le résultat devrait donner:
count | company id | company name | city
------------------------------------------
90 6 foo corp NY
45 9 bar corp LA
0 3 foobar corp HO
j'ai essayé:
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;
Mais cela ne fonctionne pas car il me dit de grouper aussi par g.name: /
Des idées?
La solution
Vous avez associé la table et la colonne à la même chose, alors ne le faites pas. Ce n'est pas invalide, juste difficile à suivre.
Quoi qu'il en soit, incluez toutes les colonnes que vous sélectionnez qui ne sont pas agrégées dans votre groupe par
:
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;
Autres conseils
Essayez ceci en tant que sous-requête:
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 vous ne souhaitez pas que le résultat de comptage soit renvoyé (à cause d'un framework ORM ou autre), vous pouvez l'appliquer directement dans la clause order by:
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;
Testé dans postgreSQL 11