Wie schauen denn die Tabellen überhaupt aus?
Da hier über ID's verknüpft wird, muss in den Feldern auch zumindest ein Wert und nicht NULL enthalten sein. Der Default-Wert NULL führt hierbei also zu keiner Verknüpfung, da keine Werte enthalten sind, das Feld also "nicht vorhanden" ist (so lässt sich NULL noch am ehesten übersetzen).
Dazu muss man dann auch die Logik berücksichtigen, welche Tabelle die "Master"-Tabelle ist, also welche Tabelle denn nun auf jeden Fall einen Wert hat, der in der "Detail"-Tabelle mit abgefragt werden soll.
Da Du hier die occ_class_id aus der 2. gejointen Tabelle holst, werden dann wohl (ohne jetzt die Tabellen und deren Inhalte näher zu kennen) wohl alle 0-Werte in der Haupttabelle nicht angefragt, bzw. dargestellt, da dazu in der Detailtabelle wohl keine Einträge vorhanden sind, oder?
Also muss c.occ_class_id schon einmal durch o.occ_class_id ersetzt werden.
Rein der Logik nach, so wie Du das eben auch zur Gruppierung mit GROUP BY angegeben hast.
Auch holst Du ein weiteres Feld (description) zum Datensatz aus der gejointen Tabelle, so daß ich mich hier eher frage, ob TABELLE 2 nicht der Master ist und TABELLE 1 hierzu nicht besser gejoint werden sollte.
Merke:
Wenn Du 2 Tabelle mit einem Join verbindest, sollten die "Hauptinformationen" immer aus der Tabelle gezogen werden, an die eine andere Tabelle eben hinzu"gejoint" wird.
So würde man z. B. bei einer Beziehung 1:n zwischen Tabelle 1 und Tabelle 2 nicht unbedingt alle Werte aus Tabelle 1 erhalten, wenn in Tabelle 2 eben keine Werte enthalten sind.
Ich weiß, insgesamt ein nicht einfaches Thema, ohne nähere Angaben zu Deinen Tabellen kann man es aber nicht wirklich viel besser erklären...