Abfrageproblem in eigener Sache (COUNT und JOINS)

Servus!
Damit mein DB-Wissen nicht einrostet arbeite ich hier zu Hause an kleineren privaten Projekten. Bisher konnte ich auch alle Abfragen mit Joins & Co meistern, jetzt stehe ich aber vor einer schier unüberwindbaren Wand:

Thema Modellbahn, es gibt u.a. zwei Tabellen: TRAINS und USERS
Trains
trainID
train
ownerID
buyerID
[...]

Users
userID
user
[...]

Es geht um folgendes: Thema Modellbahn und eine Liste aller Züge sowie deren Eigentümer bzw. Käufer. Es gibt immer genau einen Käufer und genau einen Eigentümer einer Lok. Jetzt möchte ich eine Liste mit allen Benutzern und gleichzeitig die Anzahl derer eigenen sowie gekauften Loks haben. Das Ergebnis soll dann in etwa so aussehen:

userID, user, eigene_loks, gekaufte_loks
1, User1, 0, 2
2, User2, 1, 1
3, User3, 2, 1
etc

Ich bekomme leider keine zwei COUNT-Anweisungen in einer Abfrage unter. Die Abfrage nur mit Anzahl der gekauften Loks ODER Anzahl eigener Loks funktioniert einwandfrei, aber die Kombination leider nicht. Ich möchte gerne alles in eine Abfrage packen.

Code:
SELECT `userID`, `user`, COUNT(trainID) AS eigene_loks
FROM `Users` LEFT OUTER JOIN `Trains`
ON `Users`.`userID` = `Trains`.`buyerID`
GROUP BY `user`
Das ergibt in etwa:

userID, user, eigene_loks
1, User1, 0
2, User2, 1
3, User3, 2

Es fehlt also die andere Anzahl.

Habt ihr eine Idee, wie ich die Anfrage am besten stellen kann? Ich habe auch schon mit einer Umstrukturierung der Tabellen geliebäugelt (mit "TrainToBuyer" und "TrainToOwner", jeweils trainID und userID), aber auch daran scheitere ich. Außerdem handelt es sich nicht um eine n:m Beziehung, daher sollte obige Struktur ausreichen. Ich habe so viele Abfragevarianten mit UNIONS und SubSelects durch und ich weiß einfach nicht mehr weiter.
 
Ich würde so etwas versuchen. Ist vermutlich nicht mehr sehr effizient bei vielen Daten, aber funktionieren sollte es
SELECT userid, user,
(SELECT Count(trainid) FROM trains where ownerid=userid) AS owner,
(SELECT Count(trainid) FROM trains where buyerid=userid) AS buyer
FROM users
 
Das kommt davon, wenn man zu lange an zu vielen Abfragen gehangen hat. Diese Zeilen habe ich 1:1 genauso gehabt bis auf einen feinen Unterschied: Bei den SubSelects hatte ich neben der Tabelle Trains noch Users mit reingenommen, weil ich fälschlicherweise davon ausgegeangen war, dass er beim Vergleich der ownerID mit userID meckern würde, da userID in Trains unbekannt ist. Wie dumm von mir...
Danke, man sieht leider all zu oft den Wald vor lauter Bäumen nicht...
 
Top