2009-09-09 22 views
14

Ich habe zwei Tabellen:Wie sortiere ich mit postgresql?

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

Ich mag alle Unternehmen erhalten und sie durch Zahlen von employes zu sortieren. geben

sollte Das Ergebnis:

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

Ich habe versucht:

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; 

Aber das Arbeiten ist nicht, wie es mir von g.name auch zur Gruppe sagt:/

Irgendwelche Ideen?

Antwort

19

Sie haben die Tabelle und die Spalte als die gleiche Sache aliased, so tun das nicht. Es ist nicht ungültig, nur schwer zu folgen.

Wie auch immer, sind alle Spalten, die Sie auswählen, die nicht Aggregate in Ihrem 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

meinem Tisch ist eigentlich muss größer als die auf zwei Säulen (Stadt und Name), sollte ich Gruppe von allen von ihnen? – Ggolo

+0

Ich denke, dass Sie ja für die GROUP BY-Klausel arbeiten sollten, wenn nicht die Abfrage fehlschlägt – MaxiWheat

+1

@Ggolo: Jede Spalte, die Sie auswählen, müssen Sie "gruppieren". – Eric

0

Versuchen Sie dies als eine Unterabfrage:

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