[SQL allgemein] Datum Verleih Reservierung

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

  • [SQL allgemein] Datum Verleih Reservierung

    Hallo, ich bin PHP Anfänger. Ich habe mir hier schon einiges angesehen, auch gesucht habe ich, doch jetzt komme ich nicht so richtig weiter.

    Ich schreibe gerade an einem Skript das Zimmer (oder Leihwagen, Boote, etc.) reserviert. Der Benutzer gibt ein Anreisedatum ($dan) und ein Abreisedatum ($dab) ein. Diese müssen dann mit schon reservierten Zimmern in einer MySQL Datenbank verglichen werden. Nur die Zimmer bei denen im entsprechenden Zeitraum noch keine Buchungen vorliegen sollen dann für eine Reservierung in Frage kommen, also zur Auswahl angezeigt werden.

    Ich brauche also:
    die Räume (raum_id) aus der Tabelle raum
    bei denen in der Tabelle zraum (felder: zraum_id, Anreisedatum, Abreisedatum, Raum_id, User_id)
    das Anreisedatum > als das $dan und im gleichen Datensatz
    das Abreisedatum < als das $dab.

    Wie muss die Bedingung in SQL geschrieben werden, und liege ich mit der Logik richtig?

  • #2
    probier mal
    Code:
    SELECT r.raum_id
    FROM raum r
      LEFT OUTER JOIN zraum z USING (raum_id)
    WHERE
      z.anreisedatum NOT BETWEEN '2002-11-17' AND '2002-12-15'
      AND
      z.abreisedatum NOT BETWEEN '2002-11-17' AND '2002-12-15'
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      Vielen Dank für die Antwort!

      Code:
       SELECT DISTINCT r.Raum_id 
      FROM raum r 
      LEFT OUTER JOIN zraum z USING (raum_id) 
      WHERE z.anreise NOT BETWEEN 2003-08-17 AND 2003-08-15 
      AND z.abreise NOT BETWEEN 2003-08-17 AND 2003-08-15
      Habe ich ausprobiert, jetzt werden aber nicht alle Räume angezeigt, sondern nur für die reserviert wurde, also die in der Tabelle zraum vorkkommen.

      Außerdem haben die Datumsangaben keinen selektiven Einfluß, will sagen der für den Zeitraum reservierte Raum wird trotzdem angezeigt

      Kommentar


      • #4
        tausch die datumsangaben mal
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          Code:
           SELECT DISTINCT r.Raum_id 
          FROM raum r LEFT OUTER JOIN zraum z USING (raum_id) 
          WHERE z.anreise NOT BETWEEN 2003-08-19 AND 2003-08-20 
          OR z.abreise NOT BETWEEN 2003-08-19 AND 2003-08-20
          Ich habe die Datumsangaben vertauscht, auch habe ich danach statt AND ein OR eingesetzt, da ja ein Kriterium schon zu ausscheiden führt.
          Die Fehler aus dem zweiten Posting sind aber geblieben.

          Kommentar


          • #6
            AND sollte gepasst haben

            gedacht war es so:
            liefer mir raum_id aus tabelle raum, wenn es diese raum_id nich in zraum gibt (daher der OUTER JOIN), oder wenn es sie gibt und niemand innerhalb des reservierungszeitraumes anreist und niemand abreist

            mit AND isses genauso?
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              Original geschrieben von mrhappiness
              AND sollte gepasst haben

              gedacht war es so:
              liefer mir raum_id aus tabelle raum, wenn es diese raum_id nich in zraum gibt (daher der OUTER JOIN), oder wenn es sie gibt und niemand innerhalb des reservierungszeitraumes anreist und niemand abreist

              mit AND isses genauso?
              Ja, das hört sich schon mal gut an, nur funktionieren tut es leider nicht.
              Zu dem AND statt OR: wenn jemand innerhalb des Zeitraumes anreist oder abreist, dann heißt das doch automatisch, dass es eine Überschneidung gibt, also reicht das zutreffen eines Kriteriums. Müssen bei AND denn nicht beide Kriterien zutreffen?

              Diese Abfragen sind doch sicher keine Seltenheit. Haste (man duzt sich hier doch, oder?) Skripte die einen Verleih managen, bzw. diese Abfrageproblematik behandeln hier schon einmal gesehen?

              Kommentar


              • #8
                bei AND müssen beide zutreffen, aber es heißt ja NOT BETWEEN...

                duhast deine datumsangaben schon in hochkommas stehen oder?
                z.anreise NOT BETWEEN 2003-08-19 AND 2003-08-20
                is afaik was anderes als
                Code:
                z.anreise NOT BETWEEN '2003-08-19' AND '2003-08-20'
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  So falsch? :

                  $dan = "2003-08-19";
                  $dab = "2003-08-20";


                  $sql = "SELECT DISTINCT r.Raum_id
                  FROM raum r
                  LEFT OUTER JOIN zraum z USING (raum_id)
                  WHERE
                  z.anreise NOT BETWEEN $dan AND $dab
                  OR
                  z.abreise NOT BETWEEN $dan AND $dab";

                  Kommentar


                  • #10
                    PHP-Code:
                     $sql "SELECT DISTINCT r.Raum_id
                    FROM raum r
                    LEFT OUTER JOIN zraum z USING (raum_id)
                    WHERE
                    z.anreise NOT BETWEEN '"
                    .$dan."' AND '".$dab."'
                    OR
                    z.abreise NOT BETWEEN '"
                    .$dan."' AND '".$dab."'"
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar


                    • #11
                      Ups, der Fehler geht klar an mich.

                      Funktioniert aber immer noch nicht, ich habe spaßershalber mal raum mit zraum ausgetauscht, die Ausgabe ist die gleiche

                      SELECT DISTINCT r.Raum_id
                      FROM zraum z LEFT JOIN raum r USING (raum_id)
                      WHERE
                      z.anreise NOT BETWEEN '2003-08-19' AND '2003-08-20'
                      OR
                      z.abreise NOT BETWEEN '2003-08-19' AND '2003-08-20'


                      Hier noch mal die Tabellen:
                      zraum
                      Feld Typ Null Standard
                      zraum_id int(5) Nein
                      anreise date Nein 0000-00-00
                      abreise date Nein 0000-00-00
                      gast_id int(11) Nein 0
                      raum_id char(3) Nein

                      raum
                      Feld Typ Null Standard
                      raum_id int(3) Nein
                      raumtyp char(2) Nein DZ
                      pk_id int(1) Nein 0

                      Kommentar


                      • #12
                        geb mal beispieldatensätze, mach aus dem OR ein AND und machdas vertauschen rückgängig
                        PHP-Code:
                        sql "SELECT r.raum_id
                        FROM raum r
                          LEFT OUTER JOIN zraum z USING (raum_id)
                        WHERE
                          z.anreise NOT BETWEEN '"
                        .$dan."' AND '".$dab."'
                          AND
                          z.abreise NOT BETWEEN '"
                        .$dan."' AND '".$dab."'"
                        Ich denke, also bin ich. - Einige sind trotzdem...

                        Kommentar


                        • #13
                          Ergebnis der sql wie von Dir eben gepostet, also ohne distinct:
                          raum_id
                          1
                          1
                          1
                          3
                          4
                          4


                          Tabelleninhalt:

                          Code:
                          zraum
                           zraum_id  	 anreise  	 abreise  	 gast_id  	 raum_id
                          1 	2003-08-18 	2003-09-20 	2 	1
                          2 	2003-08-21 	2003-08-25 	1 	3
                          3 	2003-08-25 	2003-08-29 	3 	4
                          8 	2003-10-28 	2003-10-29 	1 	1
                          7 	2003-09-18 	2003-09-20 	3 	1
                          4 	2003-09-28 	2003-09-29 	4 	4
                          
                          raum
                           raum_id  	 raumtyp  	 pk_id
                          1 	DZ 	1
                          2 	DZ 	2
                          3 	EZ 	1
                          4 	EZ 	3

                          EDIT:
                          code.tags by Abraxax
                          Zuletzt geändert von Abraxax; 11.08.2003, 12:16.

                          Kommentar


                          • #14
                            wie kann raum 1 von 2003-08-18 bis 2003-09-20 reserviert sein und von 2003-09-18 bis 2003-09-20?
                            bei raum 4 das gleiche

                            probier mal
                            PHP-Code:
                            $sql "SELECT r.raum_id frei, z.raum_id
                            FROM raum r
                              LEFT OUTER JOIN zraum z USING (raum_id)
                            WHERE
                              (
                                z.anreise NOT BETWEEN '"
                            .$dan."' AND '".$dab."'
                                AND
                                z.abreise NOT BETWEEN '"
                            .$dan."' AND '".$dab."'
                              )
                              OR
                              ISNULL(z.raum_id)"

                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar


                            • #15
                              Jetzt wird der bisher unreservierte Raum 2 auch angezeigt. Das ist gut.

                              Das mit der Datumsüberlagerung soll ja demnächst durch das Skript vermieden werden

                              Das war bisher der Flaschenhals, die Buchungen bzw. Reservierungen funktionieren schon.

                              Ich habe noch einmal getestet mit 2003-08-18 bis 2003-08-20. Raum 1 habe ich vorher verbessert, so dass es keine Überlagerung mehr gibt. Bei Raum 4 gibt es sowieso keine.


                              Raum 1 wird trotzdem als frei angezeigt.
                              Zuletzt geändert von Wilhelm; 11.08.2003, 12:57.

                              Kommentar

                              Lädt...
                              X