Announcement

Collapse
No announcement yet.

Unterabfrage hilfe

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Unterabfrage hilfe

    Hallo,

    ich habe eine Tabelle mitarbeiter und eine Tabelle gehaelter.

    Tabelle Mitarbeiter: name und mitarbeiter_id
    Tabelle Gehälter: mitarbeiter_id, gehalt, datum

    Es kann sein, dass ein Mitarbeiter mehrere Eintraege in gehaelter hat zu einem bestimmten datum oder gar keinen eintrag.

    Ich möchte nun zu einem bestimmten datum eine liste aller mitarbeiter mit deren gehalt zum aktuellen datum.

    Bislang habe ich folgende Abfrage, zb. zum 31.10.2007:

    PHP Code:
    select namegehalt from mitarbeiter as 
    left outer join gehaelter 
    as g on m.mitarbeiter_id=g.mitarbeiter_id 
    where 
    (g.datum=
    (
    select max(g2.datum) as id from gehaelter as g2 
    where g2
    .mitarbeiter_id=g.mitarbeiter_id 
    and g2.datum<='2007-12-31' )
     or 
    g.datum is NULL
    Es sollten bei mir 88 Datensaetze raus kommen, erhalte aber nur 44 (Zufall dass genau die Haelfte?).

    Was mache ich da bloss falsch, denn komischerweise erscheinen in den 44 Datensaetzen z.b. Mitarbeiter die kein Gehalt haben und andere die auch kein Gehalt (Eintrag in Tabelle )haben nicht

    Bin euch dankbar im Voraus.

    Gruss Thomas

  • #2
    Hallo Thomas,

    wenn du den 31.10.2007 meinst, darfst du nicht den 31.12.2007 abfragen . Aber das wird nicht das Problem sein.
    Also meiner Meinung nach fehlen dir alle die Mitarbeiter, die mindestens einen Gehaltseintrag haben, aber keinen der <= dem Abfragedatum ist. Hier greift der OUTER JOIN nicht, d.h. g.datum ist NOT NULL, die WHERE-Bedingung mit dem Subselect wird aber ebenfalls FALSE.
    Hier hilft eigentlich nur den Subselect in den Join zu verlagern. Ich weiß aber nicht inwieweit das von deiner MySQL-Version unterstützt wird.
    [highlight=sql]
    select name, gehalt from mitarbeiter as m
    left outer join (
    select g2.mitarbeiter_id, max(g2.datum) as datum
    from gehaelter as g2
    where g2.datum<='2007-12-31'
    group by g2.mitarbeiter_id) as g on m.mitarbeiter_id=g.mitarbeiter_id
    [/highlight]

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Ich würde den Join umdrehen:
      [highlight=SQL]
      select
      m.Name, g.Gehalt
      from
      gehaelter g
      join mitarbeiter m on m.ID = g.mitarbeiter_id
      where
      g.datum = :datum:[/highlight]

      Comment


      • #4
        Originally posted by Markus Kinzler View Post
        Ich würde den Join umdrehen:...]
        Dann fehlen immer noch die armen Schw..., die gar kein Gehalt haben

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Hab ich wohl überlesen

          Comment


          • #6
            Hallo Falk,

            danke erst mal für deine Antwort.
            Ich habe einen fehlenden Mitarbeiter und einen angezeigten mal angeschaut.
            Es wird ein mitarbeiter angezeigt der keinen eintrag in gehalt hat, ein anderer der auch keinen eintrag hat aber nicht.
            Das ist was ich nicht verstehe.

            Lasse ich die Unterabfrage weg, erhalte ich alle 88 Datensaetze (momentan hat ein mitarbeiter entweder genau eien Eintrag oder keinen).

            Comment


            • #7
              Also nur um sicherzugehen würde ich mal im Subselect "where g2.mitarbeiter_id=g.mitarbeiter_id" auf "where g2.mitarbeiter_id=m.mitarbeiter_id" ändern, ansonsten sehe ich erstmal keinen Fehler.

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Falk - vielen Dank. So klappt es.

                Aber wieso verstehe ich nicht.
                Das gehalt der Mitarbeiter die eines haben, sind alle mit einem Datum <2007 versehen.
                Warum erscheinen dann in meiner abfrage nicht alle mitarbeiter die keines haben ?

                Danke und gruss Thomas

                Comment


                • #9
                  Hallo,

                  gibt es vielleicht zwei Sorten von Mitarbeiern ohne Gehalt?

                  A) mit zugehörigem Gehaltsdatensatz, in dem aber kein aktuelles Gehalt steht.
                  B) ganz ohne Gehaltsdatensatz


                  Gruß frauwue
                  docendo discimus

                  Comment


                  • #10
                    @frauwue

                    Nein, gibt es nicht. intergrund ist, dass das Gehalt erst jetzt implementiert wurde und dadurch alte Datensaetze eben noch keines eingetragen haben. Neue Mitarbeiter erhalten automatisch einen Eintrag in der Tabelle Gehalt.
                    Deshalb verstehe ich auch nicht, warum meine Abfrage so nicht funktioniert, sondern nur wie Falk es sagte.
                    Das würde mich schon interessieren, weil hauptsache es funkioniert bringt mir beim nächsten Mal auch nichts.

                    Gruss Thomas

                    Comment


                    • #11
                      Hallo Thomas,

                      das g.mitarbeiter_id stammt ja aus dem OUTER-Teil des Joins und ist ggfs. NULL. Das erklärt es zwar auch nicht 100%ig, aber mglws. hat MySQL damit ein "Verständnisproblem".

                      Gruß Falk
                      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                      Comment


                      • #12
                        Hilfe schon wieder...

                        bei den mitarbeitern der firma die ich gemeint hatte, funkioniert es mit der Änderung von Falk.
                        Bei einer anderen firma aber schon wieder nicht. Von 70 Mitarbeitern wird nur einer angezeigt. Alle 70 haben keinen Eintrag in Tabelle gehalt.


                        Ich verstehe nun nichts mehr - ist das alles Zufall oder gib es ein System?

                        Danke und Gruß
                        Thomas

                        Comment


                        • #13
                          Hallo Thomas,

                          von einer zusätzlichen Einschränckung nach Firma war bisher nicht die Rede .
                          Vielleicht solltest du mal dein relevantes Statement und ein paar Beispieldatensätze posten!

                          Gruß Falk
                          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                          Comment


                          • #14
                            Hallo Falk,

                            auf die schnelle wllte ich nur das Nötigste schreiben. Es gibt noch eine Tabelle Firma mit der die Tabelle Mitarbeiter verknüpft ist.

                            Fälschlicherweise habe ich in meinm vorherigen Statement was falsches gesgt: Es wird von 70 Mitarbeitern nur einer angezeigt -> und das ist der Einzige der KEINEN Eintrag in gehalt hat.

                            Ich werde heute mittag wenn nötig mal die kompletten Tabellen einstellen. Vielleicht hilfts ja, obwohl alles funktioniert, bis auf das aktuelle Gehalt zu einem bestimmten Datum.

                            Dennoch schon mal vorab vielen Dank für deine weitere Hilfe.
                            Gruß Thomas

                            Comment

                            Working...
                            X