2009-09-09 6 views
14

ho due tabelle:Come ordinare per contare con postgresql?

Companies: (id, name, city) 
Workers: (id, name) 

vorrei ottenere tutte le aziende e ordinarli da un numero di impiegati.

Il risultato dovrebbe dare:

count | company id | company name | city 
------------------------------------------ 
90   6   foo corp  NY 
45   9   bar corp  LA 
0   3   foobar corp  HO 

ho provato:

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; 

Ma che non funziona come mi dice di gruppo da g.name troppo:/

Tutte le idee?

risposta

19

Hai alias tavola e colonna come la stessa cosa, quindi non lo fanno. Non è invalido, solo difficile da seguire.

In ogni caso, includono tutte le colonne che si sta selezionando che non sono aggregati nel group by:

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; 
+0

mio tavolo è in realtà deve più grandi di quelle due colonne (città e nome), dovrei gruppo da parte di tutti di loro? – Ggolo

+0

Penso che sì, perché la clausola GROUP BY funzioni, altrimenti la query non andrà a buon fine – MaxiWheat

+1

@Ggolo: qualsiasi colonna che stai selezionando, devi 'raggruppare per'. – Eric

0

Prova questa come una sottoquery:

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