Ankündigung

Einklappen
Keine Ankündigung bisher.

Gleiche Werte in Beziehungstabelle finden

Einklappen

Neue Werbung 2019

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

  • Gleiche Werte in Beziehungstabelle finden

    Hi zusammen,

    ich erstelle derzeit eine kleine Anwendung, um nach bestimmten Konstellationen einen gemeinsamen Termin für verschiedene Nutzer zu finden.
    Mein DB-Aufbau sieht (vereinfacht dargestellt) folgendermaßen aus:

    Tabelle User (BenutzerID, Name, Vorname, Email, ...)
    Tabelle Termine (TerminID, Datum, Uhrzeit)
    Beziehungstabelle User_Termine (TerminID, UserID, Verfügbar)

    Die Beziehungstabelle sieht dann ungefähr so aus:
    TerrminID UserID Verfügbar
    1 1 true
    2 1 false
    3 1 true
    1 2 true
    2 2 true
    3 2 false
    1 3 false
    2 3 false
    3 3 true
    Nun würde ich am liebsten mit einer Abfrage ermitteln, dass bspw. die User 1 und 2 beide am Termin 1 Zeit hätten. Die User werden dabei vorgegeben. Es sollen eigentlich nur die beiden Termine übereinstimmenden Termine (Verfügbar = true) angezeigt werden. Mit einer einfachen Abfrage (ohne Joins) ermittlere ich nur die freien Termine:

    "SELECT *
    FROM User_Termine
    WHERE (User = 1 OR User = 2) AND Verfügbar = true

    Ich bekomme es aber nicht hin, dass ich mir nur die Überschneidungen anzeigen lasse. Habe es bereits mit verschiedenen Aggragatsfunktionen versucht, was leider keinen Erfolg erbracht hat. Die Google- und Forensuche hat mir auch nichts gebracht.
    Vielleicht hat ja noch einer aus der Community noch eine brilliante Idee!?
    Über jeden Tipp wäre ich sehr dankbar!

    Herzliche Grüße und sonnige Pfingsten
    Paul

  • #2
    Was speichert du hier?
    Tabelle Termine (TerminID, Datum, Uhrzeit)

    1 2019-02-01 18:00


    Richtig?
    das gilt sagen wir für User 1

    User 2 trägt nun ein:
    2 2019-02-01 18:05

    Wie willst du hier Übereinstimmungen finden?

    Überlege dir mal was ein Termin beinhalten muss, damit man sehen kann ob sich was überschneidet.

    Überscheidungsmöglichkeiten
    Blau ist der gegebene Zeitrahmen :
    period_relations.png

    Kommentar


    • #3
      Hi,
      vielen Dank schonmal für die erste Antwort!
      Ich hatte leider vergessen zu erwähnen, dass die Termine fest vorgeben sind und von den Benutzern direkt aus einer Maske aus Checkboxen ausgewählt werden. Diese werden dann in die Beziehungstabelle übertragen mit dem zusätzlichen Attribut, ob der Termin verfügbar ist oder nicht. Deswegen reicht mir für meine Lösung ein einfacher Vergleich der Attribute in der Beziehungstabelle.
      Vielleicht lässt sich das Ganze auch nicht mit einem Statement lösen und ich muss es zur Auswertung in PHP algorithmisch lösen.

      Kommentar


      • #4
        Wenn die Termine in einer Termintabelle fest vorgegeben sind, dann muss du doch nur die ids auf Übereinstimmung prüfen.

        Also
        Code:
        SELECT count(x) FROM beziehungstabelle WHERE TerrminID=1 AND ( (UserID=1 AND Verfügbar=true) AND (UserID=2 AND Verfügbar=true));
        *ungetestet

        Wenn count(x) ungleich NULL ist dann gibt es eine Übereinstimmung.

        Ich würde in den Spaltennamen aber keine Umlaute verwenden.
        Und du solltest auf gleiche Bezeichner wert legen. Einmal User und ein anderes mal Benutzer zu verwenden stiftet nur Verwirrung.

        Kommentar


        • #5
          Vielen Dank!
          Das wäre dann die Lösung, um die Überprüfung bei einer festen Terminangabe zu überprüfen. Wichtig wäre es allerdings, dass ich alle Termine überprüfe (Es werden nur die beiden Benutzer fest angegeben). Wäre es eine gute Wahl dann die einzelnen Termine per Schleife durchzugehen und für jede Iteration ein Query an die DB zu schicken?

          Kommentar


          • #6
            Das könntest du so machen. Ob es eine Gute Idee ist, hängt immer davon ab, wie performant es ist und ob es eine billigere Lösung gibt, (JOIN oder Subquery)

            Du kannst das aber gerne ausprobieren und nimmst dann dafür ein prepared statement, da sie dafür gedacht sind.

            Kommentar


            • #7
              Der Hinweis mit den prepared Statements ist super und wird gleich mit ins Script eingebaut. So kann ich mir erstmal helfen. Ich musste nur das SQL Statement etwas abändern in:
              Code:
               
               SELECT count(x) FROM beziehungstabelle WHERE TerrminID=1 AND ( (UserID=1 AND Verfügbar=true) OR (UserID=2 AND Verfügbar=true));
              Bei Rückgabe einer "2" weiß ich, dass der Termin bei beiden Personen passt. So könnte ich theoretisch auch Daten von 3 bis x Personen abprüfen. Für mich genau das Richtige!
              Also nochmal vielen Dank für die schnelle und kompetente Hilfe! Ich hoffe, dass ich mich hier in der Community auch mal revanchieren kann.

              Kommentar

              Lädt...
              X