Ankündigung

Einklappen
Keine Ankündigung bisher.

Left Join funktioniert nicht richtig, nicht alle Werte....

Einklappen

Neue Werbung 2019

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

  • Left Join funktioniert nicht richtig, nicht alle Werte....

    HI,


    Spalten der Tabelle arbeitstage (hier stehen die vorher eingetragenen Arbeitstage für welche sich die Mitarbeiter eintragen können):

    arbeitstag_id
    jahr_id
    monat_id
    tag_id

    Inhalt ( - für Spalte):

    1 - 1 - 3 - 14
    2 - 1 - 3 - 15
    3 - 1 - 3 - 16
    4 - 1 - 3 - 17
    5 - 1 - 3 - 18
    6 - 1 - 3 - 19


    Spalten der Tabelle mverf (hier wird abgelegt wann ein Mitarbeiter gerne arbeiten, aber noch nicht fest für diesen Tag und zu einer der beiden Schichten [ Früh (schichtart_id=1) und Spätschicht (schichtart_id=2)] eingeteilt ist):

    persnr
    arbeitstag_id
    schichtart_id

    Inhalt:

    217 - 2 - 1
    217 - 4 - 1


    Für den ausgewählten Mitarbeiter (Variable $persnr) soll nun an den Tagen ein checked bei der Checkbox gesetzt werden, wo der Mitarbeiter sich schon eingetragen hat, damit man keine "Wunschzeiten" verliert bzw doppelt plant.


    Nun zeigt er mir zwar die Tage an, an welchen der Mitarbeiter laut Tabelle mverf bereits geplant ist, aber alle weiteren möglichen Arbeitstage werden dem Mitarbeiter nicht mehr angezeigt. Er kann sich dann also an den Tagen auch nicht mehr eintragen.


    Danke, habs wirklich lange versucht, komme aber gerade nicht dahinter wo der Fehler in meiner Abfrage steckt.


    Edit:

    "Wo ich hin möchte" :

    Es gibt eine Seite, man wählt einen Mitarbeiter aus, dann ein Jahr und dann einen Monat. Dann sollen alle Arbeitstage angezeigt werden, welche in der Tabelle arbeitstage mit dieser Jahr_Id und mit dieser Monats_id hinterlegt sind. An diesen Arbeitstagen kann sich der Mitarbeiter mittels einer Checkbox an jedem Arbeitstag eintragen und dann per Button an die Datenbank senden und diese werden dann in die Tabelle mverf eingetragen. Nur falls der Mitarbeiter seine Zeiten für den Monat schon einmal eingetragen hat, er also zb. einen weiteren Tag für sich einplanen will und er auf die Seite geht, sollen ja die Checkboxen von den schon ausgewählten Tagen bereits angeharkt sein (Eben das "checked" bei der entsprechenden Checkbox).

    Also kurzfassung, die Kreuzchen die der Mitarbeiter bereits für Arbeitstage gemacht sollen ihm angezeigt werden, falls der Mitarbeiter noch einmal auf die Seite "Wunscharbeitszeiten eintragen" geht.









    Der Fehler ist nun mit meiner Abfrage, dass er nurnoch die Tage anzeigt, an welchen der Mitarbeiter eingetragen ist. Er kann sich also garnicht mehr für die anderen Tage eintragen.


    Ich hoffe man kann verstehen was ich meine







    HIer die Abfrage und Anzeige für die Frühschicht


    PHP-Code:
    <table border=0>
                    <tr>
                        <td> <h3>Frühschicht</h3>
                        </td>
                    </tr>
                    </table>    
                    <table border=1>
                    
                    <?php
                    $result
    =mysql_query("SELECT distinct tag_id as tag,tag_id, if (mverf.arbeitstag_id is NULL, '', ' checked')sel FROM arbeitstage left join mverf on arbeitstage.arbeitstag_id=mverf.arbeitstag_id where arbeitstage.jahr_id='1' and arbeitstage.monat_id='3' and mverf.schichtart_id='1' and mverf.persnr='217' order by tag;");
                    
                            
                    while (
    $row mysql_fetch_array($result))
                                                    {
                                                        
    $tagef .= "<tr><td>".$row["tag"]."</td><td><input type='checkbox'  name='verff[]' value=".$row["tag_id"]." ".$row["sel"]."></td></tr>";
                                                        
                                                    }
                                                    
                                                echo 
    $tagef;
                
                
                    
    ?>
                    
                    </table>
    [img][/img]


  • #2
    Kannst du die Frage und das Problem etwas mehr zusammenfassen, ich blicke da nicht mehr durch, ich weiß garnicht was du vorhast.

    Lass mal deine Vorlage weg und sag uns welche beiden Tabellen du gerne zusammenfügen willst und nach welcher Bedingung.

    PS: Willkommen im Forum

    Kommentar


    • #3
      HI

      Danke für den Hinweis .

      Ich habs mal nochmal versucht unter "Wo ich hin möchte" zu beschreiben.

      Ist etwas komisch beschreiben

      Einfach fragen

      Edit:

      hab mal noch 4 Bilder rein gemacht um den Ablauf zu zeigen

      Kommentar


      • #4
        Ok, jetzt ist das ganze schon verständlicher

        Tabelle mverf (mitarbeiter_verfügbar, schätz ich):
        id| Mitarbeiter_id | Jahr | Monat | Tag
        PHP-Code:
        <?
        /*Informationen abfragen*/
        $sql = "SELECT Jahr, Monat, Tag FROM mverf WHERE Mitarbeiter_id=123";
        $result = mysql_query($sql);
        while($row =  mysql_fetch_assoc($result)){$a_mitarbeiter[] = $row;}
        ?>

        <table border=1> 

        <?
        /*Tabelle für User erstellen*/
        $jahr = $a_mitarbeiter['Jahr'];
        for($i=1;$i<=12;$i++){
            for($j=1;$j<=31;$j++){
                echo "<form method="POST"><tr><td>$j.$i.$jahr</td><td><input type="checkbox" name="Eingetragen" ";
                ?>
        <input type="hidden" name="tag" value="<? echo $j;?>">
        <input type="hidden" name="monat" value="<? echo $i;?>">
        <input type="hidden" name="jahr" value="<? echo $jahr;?>">
        <?
                $key = array("Jahr"=>$jahr, "Monat"=>$i, "Tag"=>$j);
                if(array_search($key, $a_mitarbeiter)!== FALSE){echo "checked></td><td><input type=\"submit\"></td></tr></form>";}
                else{echo "></td><td><input type=\"submit\"></td></tr></form>";}
            }
        }
        ?>
        </table>
        Natürlich ist das ganze noch nicht fertig, aber es dürfte klar sein wie ichs machen würde

        In die Tabelle kommen wirklich nur die einträge, wann jemand kann. alles andere wird mit php erstellt. left join wird gar nicht mehr benötigt

        sollen sich mitarbeiter aus der datenbank auch wieder austragen können?
        dann würde ich eine extra tabelle für schon bestätigte tage ausgeben lassen.

        edit: aaaah, jetzt versteh ichs ganz^^ (mit bildern is es gleich viel schöner^^) ich werde heut abend vielleicht noch mal posten
        http://www.martin-thoma.de

        Kommentar


        • #5
          Ja also Mitarbeiter sollen sich auch wieder austragen können.

          Auf dem letzten Bild siehst du genau das Problem, links mit der Left Join Abfrage, wo er nur die Tage anzeigt, wo der Mitarbeiter eingetragen ist. Und rechts ist noch die alte Abfrage drin, wo Mitarbeiterunabhängig alle Tage angezeigt werden die dort verfügbar sind. Also ohne Abfrage ob der Mitarbeiter sich schon für die Tage eingetragen hat.

          Da wurden dann einfach alle alten Einträge rausgeworfen und durch die neuen ersetzt. Aber das ist ja nix, deswegen versuch ichs nun besser zu machen, als ichs vor ein paar Wochen gemacht habe


          Zu deinem Lösungsansatz, es gibt in der Tabelle mverf aber leider keine Jahr, Monat, Tag ID sondern nur die Arbeitstag ID und eben die Personalnummer und die Schichtar_ID

          Ich kann die Tabellen auch erweitern, wenn es sein muss. Hab den ganzen Kram ja verbrochen

          Hier mal was zb in der Tabelle arbeitstage steht



          hier die Tabelle mverf:




          Schonmal danke für deine Hilfe


          Gruß

          GDRIVER

          Kommentar


          • #6
            also für ein datumsfeld jahr,monat und tag extra spalten zu machen finde ich voll abgefahren.
            Slava
            http://bituniverse.com

            Kommentar


            • #7
              Nanana, maul mal hier nicht jeden gleich an! Du weißt ja nicht was er noch so damit vor hat...

              Außerdem kennt nicht jeder immer den optimalen Weg. Wenn du meinst dass du ihn kennst dann schreib ein Tutorial dazu, zumal du auch zu viel Zeit zu haben scheinst

              sry 4 offtopic

              Kommentar


              • #8
                Zitat von GunsnRoses
                Nanana, maul mal hier nicht jeden gleich an! Du weißt ja nicht was er noch so damit vor hat...
                nenne mir ein spezieler beispiel, wo man das wirklich braucht
                Zitat von GunsnRoses
                Außerdem kennt nicht jeder immer den optimalen Weg. Wenn du meinst dass du ihn kennst dann schreib ein Tutorial dazu, zumal du auch zu viel Zeit zu haben scheinst
                sry 4 offtopic
                Ich brauche kein Tutorial zu schreiben, da es schon genug Tutorials für SQL gibt.
                Ausserdem beschreibt Mysql-Docu ziemlich gut datumsfunktionen wie Jear(),Month() und Day()..
                Wegen meiner Freizeit hast du Recht.
                Ich habe sogar die Zeit gefunden deine wertvolle Beiträge anzuschauen
                http://www.phpfriend.de/forum/search...hor=GunsnRoses
                Slava
                http://bituniverse.com

                Kommentar


                • #9
                  Hi, nunja ich hatte dies mit Jahr Monat und Tag am Anfang reingebracht für die Anzeige, wo der Benutzer etwas auswählen kann. Das ganze Projekt war meine erste Programmiersache mit PHP. Und nachher konnte ich nicht noch einmal alles von neu schreiben.

                  Daher bitte ich drum mir das nach zu sehen. Ich habe leider noch immer keine Lösung für meine Abfrage gefunden

                  Logik ist da ganz einfach, aber das in der Abfrage hin zu bekommen

                  Kommentar


                  • #10
                    Habs nun doch hin bekommen

                    $tagl_req=mysql_query("select distinct arbeitstage.arbeitstag_id from arbeitstage left join mverf on mverf.arbeitstag_id=arbeitstage.arbeitstag_id and persnr='$persnr' where arbeitstage.jahr_id='$ajahr' and arbeitstage.monat_id= '$amonat' order by arbeitstag_id;");

                    Kommentar

                    Lädt...
                    X