Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Problem mit LEFT JOIN

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von itz01, 3 Juli 2014.

  1. itz01

    itz01 Benutzer

    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
     
  2. ukulele

    ukulele Datenbank-Guru

    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.
     
  3. itz01

    itz01 Benutzer

    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
     
  4. itz01

    itz01 Benutzer

    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
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Jein. Mach es einfach sauber und verwende durchgehend expliziete Joins und nicht diese alte Komma-Syntax.
     
  6. itz01

    itz01 Benutzer

    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
     
  7. akretschmer

    akretschmer Datenbank-Guru


    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.
     
  8. BerndB

    BerndB Datenbank-Guru

    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' 
     
  9. ukulele

    ukulele Datenbank-Guru

    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.
     
  10. itz01

    itz01 Benutzer

    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden