Ankündigung

Einklappen
Keine Ankündigung bisher.

[gelöst] Komplexe MySQL Abfrage

Einklappen

Neue Werbung 2019

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

  • [gelöst] Komplexe MySQL Abfrage

    Hallo,

    ich hab hier ein Logik-Problem und komme einfach nicht weiter.
    Für einen Schichtplan besteht eine Datenbank (siehe Anhang), jeder Arbeitstag an dem der Mitarbeiter verfügbar ist und die möglichen Zeitspanne stehen in einer Zeile.
    Ich bräuchte jetzt eine Abfrage, welche mir die Miarbeiter filtert die ausschließlich Samstag und/oder Sonntag können.
    Ich hoffe mir kann da jemand weiterhelfen.

    thx
    http://phpcodechecker.com/

  • #2
    SQL für Samstag und Sonntag
    Code:
    SELECT `work_time_id` , `user_id` , `day` , `possible_time` , `favourite_time`
    FROM `mytable`
    WHERE `day` = 'Samstag'
       OR `day` = 'Sonntag'
    Bitte keine Bilder von Textauszügen hochladen, sondern Tabellen oder SQL-Dump hier als Text einfügen.

    Kommentar


    • #3
      possible_time und favourite_time sind im falschen Format gespeichert bzw. so nicht wirklicht nutz- und abfragbar. So sind es reine "Infofelder". Wenn du damit auch wirklich was abfragen/anstellen willst, dann kannst du das aufteilen und im richtigen Format speichern.

      possible_time_from und possible_time_to
      favourite_time_from und favourite_time_to

      Und als Format: https://dev.mysql.com/doc/refman/8.0/en/time.html
      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Zitat von protestix Beitrag anzeigen
        SQL für Samstag und Sonntag
        Code:
        SELECT `work_time_id` , `user_id` , `day` , `possible_time` , `favourite_time`
        FROM `mytable`
        WHERE `day` = 'Samstag'
        OR `day` = 'Sonntag'
        Bringt mir nichts, da ich ja nich suche wer Samstag oder Sonntag kann, sondern wer "nur" Samstag und/oder Sonntag kann.
        Es gibt Personen die können die ganze Woche (was Samstag/Sonntag inkludiert), ich suche aber die die nur an diesen beiden Tagen können.
        http://phpcodechecker.com/

        Kommentar


        • #5
          ich suche aber die die nur an diesen beiden Tagen können.
          Code:
          NOT IN ('Montag', 'Dienstag', ..., 'Freitag')
          ?
          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar


          • #6
            Zitat von PeterHansPaul Beitrag anzeigen

            Bringt mir nichts, da ich ja nich suche wer Samstag oder Sonntag kann, sondern wer "nur" Samstag und/oder Sonntag kann.
            Es gibt Personen die können die ganze Woche (was Samstag/Sonntag inkludiert), ich suche aber die die nur an diesen beiden Tagen können.
            Wenn du da eine zuverlässige Antwort drauf willst, und es eine wirklich komplexe Abfrage wäre, solltest du unbedingt einen Datenbank-Dump senden, damit man die empfohlenen Dinge auch testen kann. Ich empfehle bspw. ungern ungetestete Sachen, weil man da auch schonmal unliebsame Überraschungen erlebt. Du wurdest auch bereits dazu aufgefordert, warum tust du das nicht?

            Auf jeden Fall brauchst du beide Bedingungen aus #2 und #5, die mit logischem "und" verbunden: (a or b) and not in (c...).

            Kommentar


            • #7
              *brain afk*

              hausl damit hast du kein "ausschließlich".

              Kommentar


              • #8
                Mal so angedacht, nicht getestet...
                Code:
                select * from
                (select
                user_id,group_concat(concat(`day`) separator ',')
                as daylist from mytable group by user_id) as test
                where daylist = "Sonntag" or daylist = "Samstag" or daylist ="Samstag,Sonntag" or daylist ="Sonntag,Samstag"
                http://sqlfiddle.com/#!9/3ba974/4

                Kommentar


                • #9
                  Code:
                  SELECT
                          ...
                  FROM
                      work_schedule LEFT JOIN
                      (
                          SELECT
                              DISTINCT work_schedule.user_id
                          FROM
                              work_schedule
                          WHERE
                              work_schedule.day NOT IN (Sa, So)       
                      ) AS work_schedule_in_week_user ON (work_schedule.user_id = work_schedule_in_week_user.user_id)
                  WHERE
                      work_schedule.day IN (Sa, So) AND
                      work_schedule_in_week_user.user_id IS NULL
                  Der Subquery liefert alle User die irgendwann zwischen Mo-Fr "arbeiten". Das als LEFT JOIN mit IS NULL auf alle die Sa oder So arbeiten -> alle die nur Sa oder So arbeiten.

                  Kommentar


                  • #10
                    Zitat von erc Beitrag anzeigen
                    [CODE]
                    Der Subquery liefert alle User die irgendwann zwischen Mo-Fr "arbeiten". Das als LEFT JOIN mit IS NULL auf alle die Sa oder So arbeiten -> alle die nur Sa oder So arbeiten.
                    Was aber durchaus auch doppelte rows mit gleicher user_id als Ergebnis bringt.

                    Ansonsten macht es aber seinen Job....

                    http://sqlfiddle.com/#!9/3ba974/1

                    Kommentar


                    • #11
                      Zitat von kaminbausatz Beitrag anzeigen
                      Was aber durchaus auch doppelte rows mit gleicher user_id als Ergebnis bringt.
                      Du bekommst die Termine der entsprechende Benutzer. Daraus die "User" zu ziehen ist ein DISTINCT bzw. GROUP BY im äußeren Query. Das hab ich nicht so als Problem wahrgenommen.

                      Kommentar


                      • #12
                        ... ist ja auch keins, den Rest wird der TE schon hinbekommen.

                        Kommentar


                        • #13
                          Zitat von kaminbausatz Beitrag anzeigen
                          Mal so angedacht, nicht getestet...
                          Code:
                          select * from
                          (select
                          user_id,group_concat(concat(`day`) separator ',')
                          as daylist from mytable group by user_id) as test
                          where daylist = "Sonntag" or daylist = "Samstag" or daylist ="Samstag,Sonntag" or daylist ="Sonntag,Samstag"
                          http://sqlfiddle.com/#!9/3ba974/4
                          Das funktioniert super.

                          Vielen Dank
                          http://phpcodechecker.com/

                          Kommentar


                          • #14
                            kaminbausatz
                            Interessante Variante die du da einbringst.
                            Das äussere Select from lässt sich aber wohl einsparen, wenn du having benutzt.

                            PHP-Code:
                            SELECT user_idgroup_concatconcat( `day` ) SEPARATOR ',' ) AS daylist
                            FROM mytable
                            GROUP BY user_id
                            HAVING daylist 
                            "Sonntag"
                                
                            OR daylist "Samstag"
                                
                            OR daylist "Samstag,Sonntag"
                                
                            OR daylist "Sonntag,Samstag" 
                            http://sqlfiddle.com/#!9/3ba974/20

                            Kommentar


                            • #15
                              Zitat von protestix Beitrag anzeigen
                              kaminbausatz
                              Interessante Variante die du da einbringst.
                              Das äussere Select from lässt sich aber wohl einsparen, wenn du having benutzt.
                              Ich muss gestehen, dass ich das nur so hingerotzt habe und nicht weiter darüber nachdachte... Du hast natürlich recht.




                              Kommentar

                              Lädt...
                              X