Problem mit LEFT JOIN

itz01

Benutzer
Beiträge
5
Hallo zusammen,

zuerteilt einmal muss ich sagen, dass ich nicht der große DB-Spezialist bin, also seht es mir nach, falls mein Problem zu trivial ist.
Ich habe eine Projektzeiterfassung (über VB.net realisiert), die in einer MySql-DB Daten speichert. Deren wesentliche Struktur sieht folgendermaßen aus:
db_structure.png
Für die Anzeige von Daten verwende ich folgende Abfrage:
Code:
SELECT date(logStart) as 'Datum', date_format(logStart, '%H:%i') as 'Start',
    date_format(logEnd, '%H:%i') as 'Ende', projects.title as 'Projekt',
    subProjectTitle as 'Leistung', subProjects_special.title as 'Teilleistung',
    projectLog.distance AS 'Entfernung', rideTime AS 'Fahrzeit',
    vehicle AS 'Fahrzeug', projectLog.note as 'Bemerkung'
FROM projectLog, projects, subProjects, users, subProjects_special
WHERE projects.project_ID = projectLog.projectID AND
    subProjects.subProjectID =projectLog.subProjectID AND
    users.userID=projectLog.userID AND date(logStart) >= date('2014-07-01') AND
    date(logEnd) <= date('2014-07-31') AND logEnd<>'0000-00-00 00:00:00' AND
    projectLog.subProjectSpecialID=subProjects_special.ID_special 
ORDER BY Datum, 'Start'
Diese Abfrage funktioniert, allerdings zeigt Sie nur solche Einträge aus der Tabelle 'projectLog' an, für die der Wert in der Spalte 'subProjectsSpecialID' <>0 ist. Ich hätte aber gern alle.

Mein Versuch im LEFT JOIN funktioniert leider nicht.
Code:
SELECT date(logStart) as 'Datum', date_format(logStart, '%H:%i') as 'Start',
    date_format(logEnd, '%H:%i') as 'Ende', projects.title as 'Projekt',
    subProjectTitle as 'Leistung', subProjects_special.title as 'Teilleistung',
    projectLog.distance AS 'Entfernung', rideTime AS 'Fahrzeit',
    vehicle AS 'Fahrzeug', projectLog.note as 'Bemerkung'
FROM projectLog, projects, subProjects, users
LEFT JOIN subProjects_special ON projectLog.subProjectSpecialID=subProjects_special.ID_special
WHERE projects.project_ID = projectLog.projectID AND
    subProjects.subProjectID =projectLog.subProjectID AND
    users.userID=projectLog.userID AND date(logStart) >= date('2014-07-01') AND
    date(logEnd) <= date('2014-07-31') AND logEnd<>'0000-00-00 00:00:00' 
ORDER BY Datum, 'Start'
Es kommt als Fehlermeldung: Unknown column 'projectLog.subProjectSpecialID' in 'on clause', obwohl es die Spalte ja tatsächlich gibt.

Wäre schön, wenn mir jemand helfen könnte, ich komme leider gerade nicht weiter.

Vielen Dank im Voraus für Eure Hilfe,
Steffan
 
Werbung:
Bei der Fehlermeldung kann es sich eigentlich nur um einen Schreibfehler handeln. Das hier muss gehen sonst irrt sich vieleicht auch deine Skizze.
Code:
SELECT    *
FROM    projectLog
LEFT JOIN subProjects_special
ON        projectLog.subProjectSpecialID = subProjects_special.ID_special
Eventuell hast du subProjectSpeciallD geschrieben.
 
Erst mal vielen Dank für die schnelle Antwort ...
Das hatte ich zunächst bei dieser Fehlermeldung auch gedacht. Deshalb habe ich mehrmals auf Schreibfehler kontrolliert.
Deine LEFT JOIN - und ON- Zeilen sind allerdings genau wie in meiner obigen Abfrage. Meine Datenbankskizze ist übrigens auch korrekt.
Deine Abfrage funktioniert jedoch. Der Fehler muss also wo anders liegen, als die Fehlermeldung suggeriert.

Gruß,
Steffan
 
Ich habe noch ein wenig rumprobiert.
Es scheint daran zu liegen, wie viele Tabellen hinter FROM stehen.
Folgende Abfrage funktioniert:
Code:
SELECT date(pl.logStart) as 'Datum', date_format(pl.logStart, '%H:%i') as 'Start',
    date_format(pl.logEnd, '%H:%i') as 'Ende', 
    pl.distance AS 'Entfernung', pl.rideTime AS 'Fahrzeit',
    pl.vehicle AS 'Fahrzeug', pl.note as 'Bemerkung', sps.title as 'Teilleistung'
FROM    projectLog as pl
LEFT JOIN subProjects_special as sps ON pl.subProjectSpecialID = sps.ID_special

Und folgende nicht:
Code:
SELECT date(pl.logStart) as 'Datum', date_format(pl.logStart, '%H:%i') as 'Start',
    date_format(pl.logEnd, '%H:%i') as 'Ende', p.title as 'Projekt', 
    pl.distance AS 'Entfernung', pl.rideTime AS 'Fahrzeit',
    pl.vehicle AS 'Fahrzeug', pl.note as 'Bemerkung', sps.title as 'Teilleistung'
FROM    projectLog as pl, projects as p
LEFT JOIN subProjects_special as sps ON pl.subProjectSpecialID = sps.ID_special
Hier verweist die Fehlermeldung wieder auf die unbekannte Spalte 'subProjectSpecialID' (auch diesmal kein Schreibfehler).

Gruß,
Steffan
 
Kannst du das vielleicht etwas genauer ausführen? Was meinst du mit "expliziten Joins" und was mit "alter Komma-Syntax"? Und was spricht gegen letztere?

Gruß,
Steffan
 
Kannst du das vielleicht etwas genauer ausführen? Was meinst du mit "expliziten Joins" und was mit "alter Komma-Syntax"? Und was spricht gegen letztere?

Gruß,
Steffan


select bla from foo left join blub on ... versus select bla from foo, blub where ..., ersteres ist deutlich besser lesbar und zeigt auch besser, was das für ein Join ist. Bei der Komma-Syntax vermengst Du Join- und Where - Condition.
 
Hier mal was genauer.
In deinem SELECT sind die Komma getrennten Tabellen
auch JOINS wobei die JOIN Konditionen im WHERE angegeben sind.
Du hättest die neue Tabelle einfach mit Komma dahinter schreiben können und die Kondition einfach mit AND in den WHERE Teil gestellt.
Sauberer ist es jedoch die bisherigen Joins einfach anders zu schreinben und dann den neuen JOIN einfach darunter.

Dann sieht das etwa so aus.

Code:
SELECT date(logStart) as 'Datum', date_format(logStart, '%H:%i') as 'Start',
    date_format(logEnd, '%H:%i') as 'Ende', projects.title as 'Projekt',
    subProjectTitle as 'Leistung', subProjects_special.title as 'Teilleistung',
    projectLog.distance AS 'Entfernung', rideTime AS 'Fahrzeit',
    vehicle AS 'Fahrzeug', projectLog.note as 'Bemerkung'
FROM projectLog
LEFT JOIN projects ON projects.project_ID = projectLog.projectID
LEFT JOIN subProjects ON subProjects.subProjectID =projectLog.subProjectID
LEFT JOIN users ON users.userID=projectLog.userID
LEFT JOIN subProjects_special ON projectLog.subProjectSpecialID=subProjects_special.ID_special
WHERE   date(logStart) >= date('2014-07-01') AND
        date(logEnd) <= date('2014-07-31') AND
        logEnd<>'0000-00-00 00:00:00'
ORDER BY Datum, 'Start'
 
Aber mal ganz ehrlich, gehen müsste es eigentlich trotzdem. Ich fände es einen fiesen Bug wenn ich JOIN in Komma-Syntax nicht mit LEFT JOIN kombinieren könnte, leserlich hin oder her.

PS: Bei mir (MSSQL) geht das übrigens astrein, also wenn dann wittere ich hier einen MySQL Bug.
 
Werbung:
Wie gesagt, ich habe die Rechtschreibung jetzt mehrfach kontrolliert und es hat mit meiner ursprünglichen Abfrage eben nicht funktioniert.
Der Tip von BerndB hat allerdings geholfen, so produziert die Abfrage das gewünschte Ergebnis.

Vielen Dank für Eure Hilfe!
Steffan
 
Zurück
Oben