Frage

Ich habe zwei Tabellen:

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

Ich möchte alle Unternehmen erhalten und sie durch Zahlen von employes sortieren.

Das Ergebnis sollte geben:

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 funktioniert nicht, wie es mich zu einer Gruppe von g.name sagt auch: /

Irgendwelche Ideen?

War es hilfreich?

Lösung

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 keine Aggregate in Ihrem group by sind:

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;

Andere Tipps

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

Wenn Sie nicht möchten, dass die Zählergebnis Rückkehr zu sein (wegen einer ORM-Framework oder so), die Sie direkt in der Reihenfolge von Klausel anwenden könnten:

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;

Getestet in postgreSQL 11

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top