Hallo,
ich möchte eine im Grunde einfache Aufgabe lösen, da ich von solchen Datenbankoperationen, insbesondere JOINs, aber keine Ahnung habe und keine gute Einführung finde, bin ich nur durch Ausprobieren vorangekommen. Für Lektüretipps dazu wäre ich auch dankbar.
Gegeben sind drei Tabellen, in der einen stehen die Benutzerdaten, in der zweiten Meldungen (so etwas wie Posts) und in der dritten die Kommentare bzw. Ergänzungen zu den Meldungen (linear, wie in einem Board). Der Primärindex der Benutzertabelle ist loginname, die Meldungen haben ein entsprechendes loginname-Feld und den Primärindex msgid, die Kommentare haben entsprechende loginname- und msgid-Felder. So sind die Tabellen miteinander verknüpft.
Für die Übersichtsseite will ich nun die Meldungen auflisten. Dazu sollen aus der Meldungstabellen die Meldungsdaten geholt werden und einige zum jeweiligen loginnamen gehörenden Benutzerdaten aus der Benutzertabelle. Das ginge soweit mit einem Select über zwei Tabellen mit WHERE meldungen.loginname=benutzer.loginname. Zusätzlich will ich nun abfragen, wieviele Kommentare es in der Kommentartabelle zur jeweiligen Meldung gibt. Alles soll in einem Select abgehandelt werden und ich dachte mir, dass müsste gehen und ein Extraselect für die Kommentarzahle ist nicht nötig.
Ich bin soweit gekommen:
SELECT
meldungen.msgid,
/* ...Weitere Daten aus der meldungen-Tabelle... */
benutzer.vorname,
benutzer.nachname,
/* ...Evtl. weitere Daten aus der benutzer-Tabelle... */
COUNT(kommentare.msgid) AS kommentarzahl
FROM meldungen
LEFT JOIN benutzer ON meldungen.loginname=benutzer.loginname
LEFT JOIN kommentare ON meldungen.msgid=kommentare.msgid
WHERE meldungen.sichtbar="1"
GROUP BY meldungen.msgid
ORDER BY meldungen.aenderung DESC
Damit bekomme ich die Meldungsdaten, die zugehörigen Benutzerdaten und die jeweilige Kommentarzahl in einem Datensatz.
Das funktioniert soweit in den getesteten Fällen (Kommentare/keine Kommentare, Benutzer vorhanden/Benutzer nicht vorhanden, ...), scheint die Aufgabe zu erfüllen und scheint mir insgesamt logisch. Aber bekanntlich ist »es funktioniert« meist nicht hinreichend und vielleicht gibt es Fälle, die ich nicht abschätzen kann. Ist dies also eine effiziente Lösung? Lässt es sich besser lösen? Ist das Konzept bereits ineffizient?
Mathias