Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Probleme mit JOIN - Daten aus drei Tabellen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Probleme mit JOIN - Daten aus drei Tabellen

    Guten Tag!

    Ich versuche seit geraumer Zeit eine MySQL-Abfrage über mehrere Tabellen zu erstellen, scheitere aber an den Joins. Ich habe mir heute mehrfach einige Referenzen dazu durchgelesen, brauche aber anscheinend Hilfe, um das auf meinen Fall anwenden zu können.

    Ich habe drei Tabellen (jobs, workers, workers_jobs), die wie folgt aufgebaut sind.
    jobs:
    job_ID | job_name | startdate | enddate | calculated_time | active
    (Zuerst benötige ich nur job_ID und job_name)

    workers:
    worker_ID | worker_name | weekdays | dayhours

    workers_jobs:
    const_ID | worker_ID | job_ID


    Die Tabellen sind wie folgt gefüllt:
    jobs beinhaltet einen Auftrag genau einmal, job_ID ist unique und auto_increment.
    workers beinhaltet jeden Arbeiter genau einmal, worker_ID ist unique und auto_increment.
    workers_jobs führt beide zusammen. const_ID ist hier unique und auto_increment, worker_ID kann eine ID aus workers beinhalten, job_ID eine aus jobs. Es können mehrere worker_ID zu einer job_ID bestehen, aber auch umgekehrt mehrere job_ID zu einer worker_ID. Sprich: mehrere Arbeiter können an einem Auftrag arbeiten, aber ein Arbeiter kann auch an mehreren Aufträgen arbeiten.

    Mein SELECT sieht bisher so aus:

    Code:
    SELECT
        `workers_jobs`.`job_ID`,
        `workers_jobs`.`worker_ID`,
        `jobs`.`job_ID`,
        `jobs`.`job_name`,
        `workers`.`worker_ID`,
        `workers`.`worker_name`
    FROM
        `workers_jobs`
    LEFT JOIN `jobs` ON `jobs`.`job_ID` = `workers_jobs`.`job_ID`
    LEFT JOIN `workers` ON `workers`.`worker_ID` = `workers_jobs`.`worker_ID`
    Ich bekomme als result allerdings nur:

    Code:
    workers_jobs.job_ID	|	workers_jobs.worker_ID	|	jobs.job_ID	|	jobs.job_name	|	workers.worker_ID	|	workers.worker_name
    1					|	1						|	NULL		|	NULL			|	1					|	name1
    2					|	1						|	NULL		|	NULL			|	1					|	name1
    2					|	2						|	NULL		|	NULL			|	2					|	name2
    Ich hätte aber gerne:

    Code:
    workers_jobs.job_ID	|	workers_jobs.worker_ID	|	jobs.job_ID	|	jobs.job_name	|	workers.worker_ID	|	workers.worker_name
    1					|	1						|	1			|	job1			|	1					|	name1
    2					|	1						|	2			|	job2			|	1					|	name1
    2					|	2						|	2			|	job2			|	2					|	name2

    Wie kann ich das lösen?
    Vielen Dank im voraus!

    Edit: Ich sehe gerade, dass die Darstellung etwas ungünstig ist. Wenn man die "Tabellen" hier raus kopiert und in ein Textdokument, steht alles schön getabbt untereinander.


  • #2
    Code:
    SELECT
        `workers_jobs`.`job_ID`,
        `workers_jobs`.`worker_ID`,
        `jobs`.`job_ID`,
        `jobs`.`job_name`,
        `workers`.`worker_ID`,
        `workers`.`worker_name`
    FROM
        `workers_jobs`
    LEFT JOIN `jobs` ON `jobs`.`job_ID` = `workers_jobs`.`job_ID`
    LEFT JOIN `workers` ON `workers`.`worker_ID` = `workers_jobs`.`worker_ID`
    FROM muss alle Tabellen, die im SELECT verwendet wurden, angeben.

    Und was genau willst du ausgegeben haben? Du gibst z.B. mehrmals die ID eines Arbeiters aus. Reichen würde ja nur einmal.

    In einem Textdokument sieht die Darstellung der Tabellen auch nicht besser aus.

    Kommentar


    • #3
      Hallo Spamversender,

      danke für deine Antwort.
      FROM muss alle Tabellen, die im SELECT verwendet wurden, angeben.
      Ist das so? Ich nutze ja Join, wie sollte das deiner Meinung nach da aussehen?

      Und was genau willst du ausgegeben haben? Du gibst z.B. mehrmals die ID eines Arbeiters aus. Reichen würde ja nur einmal.
      Theoretisch bräuchte ich nur job_ID, job_name und worker_ID. Das tut aber ja hier nichts zur Sache, da es in auch so nicht funktioniert. Ich habe mehr ausgegeben, damit ich sehen kann, was fehlt.

      In einem Textdokument sieht die Darstellung der Tabellen auch nicht besser aus.
      Bei mir schon. Ist allerdings Linux.

      Kommentar


      • #4
        Ist das so? Ich nutze ja Join, wie sollte das deiner Meinung nach da aussehen?
        Versuch mal From workers, jobs, workers_jobs

        ansonsten kannst du ja mal versuchen einen und beide left joins mit right joins zu tauschen

        Kommentar


        • #5
          Code:
          SELECT
             `workers_jobs`.`job_ID`,
             `workers_jobs`.`worker_ID`,
             `jobs`.`job_ID`,
             `jobs`.`job_name`,
             `workers`.`worker_ID`,
             `workers`.`worker_name`    
          FROM
             `workers`  
          LEFT JOIN
             `workers_jobs`     
                ON `workers`.`worker_ID` = `workers_jobs`.`worker_ID`  
          LEFT JOIN
             `jobs`     
                ON `workers_jobs`.`job_ID` = `jobs`.`job_ID`
          Keine Ahnung, ob du das willlst. Bin aus deinen Tabellen nicht schlau geworden, bzw zu faul mir die jetzt genau anzusehen um zu analysieren was du für ein Ergebnis willst. Diese Query nimmt die Arbeiter als Grundlage und sucht sich die passenden Verknüpfungen raus. Sollte einfacher sein, als von den Verknüpfungen auszugehen

          Für nächstes mal: In einem kurzen Satz erwähnen, was das Ergebnis darstellen soll.

          Falls diese Query nicht passt: http://sqlfiddle.com Paar Beispieldaten und den oben erwähnten Satz bitte.
          Relax, you're doing fine.
          RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

          Kommentar


          • #6
            Ansonsten kannst du auch mal versuchen ob du mit Klammersetzung weiter kommst

            Kommentar


            • #7
              Nein. + Nein zu der Aussage mit dem FROM.
              Nicht raten.
              Relax, you're doing fine.
              RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

              Kommentar


              • #8
                Nein zu der Aussage mit dem FROM.
                Stimmt hab ich auch grad beim austesten gemerkt

                @TE willst du zufällig die Tabelle workers_jobs ausgegeben haben, bloß statt den IDs die Namen? D.H. worker_name und job_name

                Kommentar


                • #9
                  Ah, das ist ein cooles Tool, das kannte ich noch gar nicht. Danke.
                  Hier ist die Datenbank:
                  http://sqlfiddle.com/#!2/0ba447/3

                  Gut, ich versuche es noch mal weniger ausschweifend:
                  Ich will (erstmal) wissen, welcher Arbeiter an welchem Auftrag arbeitet (aufgelistet in workers_jobs), dabei möchte ich den Auftragsnamen aus jobs und den Arbeiternamen aus workers sehen, sie sind über job_ID und worker_ID zuweisbar.

                  Danke für die Mühe!

                  Kommentar


                  • #10
                    dazu musst du einfach folgendes machen (ich hab das gleiche szenario vorhin zum selbsttest auch durchgespielt):

                    Du hast bei workers_jobs JobIDs angegeben die nicht existieren. Habs mal korrigiert: http://sqlfiddle.com/#!2/71fbf/1

                    der erste join gibt (wenn du im select jobs.job_name wegdenkst) eine Liste mit den Namen der Arbeiter. Dabei ist in er Spalte workers_jobs.worker_id jede id mit dem zugehörigen Namen ersetzt.
                    Der zweite verbindet die Job-IDs mit den Jobnamen. (hoffe das ist verständlich erklärt)

                    Kommentar


                    • #11
                      Ach je. Das ist peinlich. Ich sitze seit gestern abend daran, diesen blöden Fehler zu suchen und komme nicht auf die Idee, mal die Daten zu überprüfen. Danke für eure Hilfe trotzdem und schön, dass ihr mich nicht schlagt.

                      Hintergrund: habe gestern die Indizes geändert und die Kardinalität zurückgesetzt. Dabei vergessen die IDs in der anderen Tabelle zu ändern.

                      Kommentar

                      Lädt...
                      X