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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top