SQL left join: NULL überschreiben?

lordfritte

Lieutenant
Registriert
Juli 2006
Beiträge
969
Hallo, ich habe in einer MySQL Datenbank 2 Tabelle:
Code:
CREATE TABLE `konten` (
 `idKonto` int(11) NOT NULL AUTO_INCREMENT,
 `kontoTyp` int(11) NOT NULL DEFAULT '0',
 `name` varchar(30) NOT NULL,
 `wert` double NOT NULL DEFAULT '0',
 PRIMARY KEY (`idKonto`),
 UNIQUE KEY `ui_konto` (`name`)
) ENGINE=InnoDB
Und:
Code:
CREATE TABLE `buchungen` (
 `idBuchung` int(11) NOT NULL AUTO_INCREMENT,
 `buchungsTyp` int(11) NOT NULL DEFAULT '0',
 `datum` datetime NOT NULL,
 `idKonto` int(11) NOT NULL,
 `wert` double NOT NULL DEFAULT '0',
 `beschreibung` varchar(120) NOT NULL,
 PRIMARY KEY (`idBuchung`),
 KEY `fk_buchung_idKonto` (`idKonto`),
 CONSTRAINT `fk_buchung_idKonto` FOREIGN KEY (`idKonto`) REFERENCES `konten` (`idKonto`)
) ENGINE=InnoDB
In Konten, werden Konten erfasst, wert stellt einen startwert bei Erfassung da.
In Buchungen werden für jedes Konto Buchungen Erfasst, Beträge die rausgehen oder rein kommen.

Die Auflistung der Konten erfolgt mit folgender Abfrage:
Code:
SELECT k.idKonto AS idKonto, k.kontoTyp AS kontoTyp, k.name AS name, k.Wert + SUM(b.Wert) AS wert, k.wert As startWert 
FROM Konten AS k 
LEFT JOIN Buchungen As b ON k.idKonto = b.idKonto 
GROUP BY k.idKonto;
k.Wert + SUM(b.Wert) AS wert brauche ich, um mir immer die aktuellen Guthaben auf den Konten anzeigen zu lassen.

Ich benutze ein LEFT JOIN, weil ich auch Konten auflisten möchte zu denen es noch keine Buchungen gibt.

Jetzt zu meinem Problem: Bei Konten, zu denen es noch keine Buchung gibt, habe ich in der Spalte wert einen NULL-Wert. Kann ich die NULL-Werte automatisch durch k.wert ersetzen lassen? Oder zu mindestens einrichten, dass bei SUM(b.Wert) als Ergebnis 0 rauskommt?
 
das mit ifnull sollte funktionieren,
sinnvoll wäre aber die tabellen struktur zu ändern.

So könnte man den Startwert auch als Buchung eintragen,
vielleicht als Beschreibung="start" aber das wäre sauberste lösung denke ich.
 
AlbertLast schrieb:
das mit ifnull sollte funktionieren,
sinnvoll wäre aber die tabellen struktur zu ändern.

So könnte man den Startwert auch als Buchung eintragen,
vielleicht als Beschreibung="start" aber das wäre sauberste lösung denke ich.

Die Summe der Buchungswerte könnte durchaus für bessere Performance direkt im Konto mit abgespeichert werden. Bedingt halt aber mehr Code und Planung, sodass dieser Wert explizit jedesmal neu ermittelt würde bei allen Datenänderungen (bei Mass Updates ggf. wieder von Nachteil).
Ansonsten ist die Summierung im LEFT JOIN der praktiabelste Weg hier (das ganze Select könnte auch gleich als VIEW angelegt werden).
 
Darauf wollte ich NICHT hinaus,
der startwert soll als solches auch ein datensatz in Buchungen sein.
 
Zurück
Oben