Tabelle doppelt ansprechen

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

  • Tabelle doppelt ansprechen

    Moin,
    bastel gerade an einem Projektmanagment Tool.
    Habe jetzt folgendes Problem:
    in einer Tabelle "user" werden alle mitarbeiter gespeichert
    Tabelle "project" die Projektdaten und in der Tabelle "work" Daten für einzelne Arbeitsabschnitte.

    Jetzt will ich mir eine Abfrage bauen, die mir alle Projekte anzeigt, bei denen seit mehr als 1nem Monat kein Eintrag durchgeführt wurde.

    Hier das SQL Statement:
    PHP-Code:
    select DISTINCT 
    project
    .name as Projektnamekunde.name as kundenname
    work.description as wCommentuser.name as Projektleiter
    max(DATE_FORMAT(replace(work.datum,' ',''), '%Y%m')) as LastWorkDatum
    work.datum, (DATE_FORMAT(NOW(), '%Y%m') - 1) AS today,
    work.id as work_idwork.projectid,  work.userid as work_userid,
    project.id as project_id,  project.pleiterproject.finishedproject.kundenidkunde.id
    user.id as user_iduser.status,  user.email
    FROM work
    LEFT JOIN project ON work
    .projectid project.id 
    LEFT JOIN kunde ON project
    .kundenid kunde.id 
    LEFT JOIN user ON project
    .pleiter user.id
    WHERE
    project
    .finished 'no'
    AND
    user.status 0
    group by project_id
    having LastWorkDatum 
    today 
    order by user
    .id desc 
    Die tabellen "project" und "work" sind über die project.id verknüpft,
    Jedes Project hat einen Projectleiter (per userid) und jede Tätigkeit (=work) wird auch über die userid einem Mitarbeiter zugeordnet.
    Jeder Mitarbeiter kann sowohl ein user wie auch Projektleiter sein, es gibt aber nur einen Projektleiter pro Projekt...

    Und da setzt mein Problem an:
    die obige Abfrage liefert mir die letzte Tätigkeit aller aktiven Projekte, bei denen seit mehr als einem Monat kein Eintrag stattgefunden hat. Ich hätte jetzt gerne noch den Namen des Users, der diesen letzten Eintrag gemacht hat (was nicht zwangsläufig der Projektleiter sein muß).
    Dafür müsste ich aber die Tabelle 'user' nochmal ansprechen (bisher liefert diese mir den Projektleiter), sinngemäß:
    LEFT JOIN user as worker ON work.userid = user.id
    Habe leider keinen Schimmer, wie ich das angehen soll und bitte euch um Hilfe, Tips & Tricks
    "I don't want to belong to any club that would accept me as a member."

    Groucho Marx

  • #2
    ON work.userid = worker.id
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      Hy mrHappines,
      dein:
      ON work.userid = worker.id
      entspricht schon meinem:
      LEFT JOIN user as worker ON work.userid = user.id

      Wie würdest du denn das Problem allgemein angehen?

      das== Eine Tabelle in einer Abfrage unter 2 verschiedenen Gesichtspunkten ansprechen
      zb. Brauche ich aus der Tabelle user das Feld name einmal als:
      Name des Projektleiters
      Name des Mitarbeiters, der den letzten Eintrag vorgenommen hat

      lg,
      McMurphy

      p.s.:
      das habe ich noch rausgenommen:
      AND
      user.status > 0
      "I don't want to belong to any club that would accept me as a member."

      Groucho Marx

      Kommentar


      • #4
        So wie ich geschrieben habe

        Ich verstehe dein Problem nicht ganz.

        Wenn du im ON-Teil mit user.id arbeitest, ist das die selbe Tabelle, die du oben auch verwendet hast, wenn du im ON-Teil mit worker arbeitest, ist das die gleiche Tabelle (gleicher Inhalt) aber ein anderer Name, ein Alias.
        So kannst du eine Tabelle in einem SELECT mehrmals ansprechen und jedesmal andere Daten lesen.
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          meinst du:
          FROM work, user as worker
          LEFT JOIN project ON work.projectid = project.id
          LEFT JOIN kunde ON project.kundenid = kunde.id
          LEFT JOIN user ON project.pleiter = user.id
          LEFT JOIN worker ON work.userid = worker.id
          ?
          "I don't want to belong to any club that would accept me as a member."

          Groucho Marx

          Kommentar


          • #6
            Mit ON work.userid = worker.id meinte ich komplett:
            LEFT JOIN user as worker ON work.userid = worker.id

            Im SELECT-Teil solltest du die Daten natürlich auch mit worker.email = mail_bearbeiter auslesen
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              lieber OP, man kann einen Tabelle zweimal joinen, und muss ihr dann zwei aliasse geben und muss dann mit diesen arbeiten.

              falsch:
              LEFT JOIN user as worker ON work.userid = user.id

              richtig von mrhappiness:
              LEFT JOIN user as worker ON work.userid = worker.id

              falsche Aussage von OP:
              dein:
              ON work.userid = worker.id
              entspricht schon meinem:
              LEFT JOIN user as worker ON work.userid = user.id

              Kommentar


              • #8
                OffTopic:
                Wenigstens ein Menschenkind, das mich versteht
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  & THX
                  Habe das Statement zwar noch nicht 100% zusammenen, weiß aber jetzt wenigstens wo's langgeht.
                  Melde mich ev. nochmal Morgen wieder (hoffe aber nicht )
                  "I don't want to belong to any club that would accept me as a member."

                  Groucho Marx

                  Kommentar


                  • #10
                    Original geschrieben von mcmurphy
                    Melde mich ev. nochmal Morgen wieder (hoffe aber nicht )
                    OffTopic:
                    Soll ich was sagen?
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar


                    • #11
                      @muh
                      lieber OP...
                      wat heißt eigentlich OP?
                      "I don't want to belong to any club that would accept me as a member."

                      Groucho Marx

                      Kommentar


                      • #12

                        wage es ja fast nicht zu sagen, habe aber immer noch einen Fehler:
                        Hier erstmal die Tabellenstruktur (Ausschnitt):

                        tbl work:
                        id projectid datum description

                        tbl projekt:
                        id name finished

                        Ich will für jedes Projekt (das nicht 'finished' ist) den letzten Eintrag aus der Tabelle work (datum, description), der älter als einen Monat ist

                        Mit dem Statement:
                        PHP-Code:
                        SELECT DISTINCT
                        project
                        .name as Projektname,  
                        work2.description as description,
                        max(work.datum) as datummax(work2.datum) as datum2
                        max(DATE_FORMAT(replace(work.datum,' ',''), '%Y%m')) as LastWorkDatum
                        (
                        DATE_FORMAT(NOW(), '%Y%m') - 1) AS today,
                        work.id as work_idwork2.id as work2_idwork.projectid,  
                        project.id as project_id,  project.finished 
                        FROM work
                        LEFT JOIN project ON work
                        .projectid project.id 

                        // So ich nehme von den folgenden beiden Zeilen
                        //entweder:
                        LEFT JOIN work AS work2 ON work.datum work2.datum2
                        //oder!!!
                        LEFT JOIN work AS work2 ON work.id work2.id
                        // NICHT beide !!!


                        WHERE
                        project
                        .finished 'no'
                        group by project.name
                        having LastWorkDatum 
                        today 
                        Hatte euer Beispiel so verstanden, das mir die Zeile:
                        LEFT JOIN work AS work2 ON work.id = work2.id

                        die Tabelle work zweimal ansprechen kann.

                        Habe jetzt konkret 2 Fragen:
                        die Zeile
                        PHP-Code:
                        LEFT JOIN work AS work2 ON work.datum work2.datum2 
                        liefert mir den Fehler:
                        Unknown column 'work2.datum2' in 'on clause
                        obwohl ich datum2 als alias definiere.

                        Frage 2:
                        bekomme zwar die Zeile mit dem richtigen Datum, aber die work.id sowie work.description stimmen nicht ( deswegen auch der Versuch mit:
                        LEFT JOIN work AS work2 ON work.datum = work2.datum2)

                        Schnalle es einfach nicht, bin aber auch recht ungeübt in mySql.
                        Deswegen ausnahmsweise die Bitte um ein komplettes Statement,
                        welches mir den letzten Eintrag pro Project liefert.
                        Verstehe insbesonders nicht, das mir zwar mit max(datum) das richtige Datum angezeigt wird, aber nicht die entsprechenden andern felder dieser Zeile
                        Zuletzt geändert von mcmurphy; 31.05.2006, 14:45.
                        "I don't want to belong to any club that would accept me as a member."

                        Groucho Marx

                        Kommentar


                        • #13
                          Ohne alles gelesen zu haben: ON work.datum = MAX(work2.datum)

                          GEht das?
                          Ich denke, also bin ich. - Einige sind trotzdem...

                          Kommentar


                          • #14
                            schnüff:
                            Invalid use of group function
                            "I don't want to belong to any club that would accept me as a member."

                            Groucho Marx

                            Kommentar

                            Lädt...
                            X