Ankündigung

Einklappen
Keine Ankündigung bisher.

Saison-Preise aus DB auslesen und berechnen

Einklappen

Neue Werbung 2019

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

  • Saison-Preise aus DB auslesen und berechnen

    Hallo, ich möchte für Zimmer einen Preis berechnen wenn der Gast die An- und Abreise eingibt. Dazu habe ich eine "Preisliste" erstellt mit den verschiedenen Saison-Arten.
    Ich habe folgende Tabellen:

    saison: id INT, von DATE, bis DATE
    preis: id INT, tag INT, saison INT, preisliste INT
    preisliste: id INT, name VARCHAR
    zimmer: id INT, name VARCHAR, preisliste INT

    D.h. die Preisliste für das Zimmer kann ich mit folgendem Statement ausgeben:
    Code:
    SELECT von, bis, tag FROM zimmer z INNER JOINpreisliste pl ON z.preisliste=pl.id INNER JOIN preis p ON pl.id=p.preisliste INNER JOIN saison s ON s.saison=p.saison WHERE z.id=1
    Nun habe ich mir folgenden Ansatz gedacht: ich erstelle eine Abfrage, bei der ich die betreffende(n) Saison(s) (falls es sich überschneidet) raussuche und danach, falls es zwei Saisons sind, ein Array erstelle in dem jeder Tag dazwischen eingetragen wird, das dann so aufgebaut ist ("yyyymmdd" => tagespreis). Zum Schluss zähle ich dann alle Preise der Tage die zwischen An- und Abreise liegen zusammen, ansonsten mache ich einfach den Preis * Tage, wenn es nur eine Saison ist.

    Geht das auf eine schnellere "einfachere" Art?
    Vielen Dank.

  • #2
    Zitat von migum Beitrag anzeigen
    Geht das auf eine schnellere "einfachere" Art?
    Ja

    Kommentar


    • #3
      Zitat von kaminbausatz Beitrag anzeigen

      Ja
      Könntest du mir den Ansatz dazu geben?

      Kommentar


      • #4
        MOD: Verschoben von PHP-Einsteiger
        The string "()()" is not palindrom but the String "())(" is.

        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


        • #5
          Zitat von migum Beitrag anzeigen

          Könntest du mir den Ansatz dazu geben?
          Nö, Dein Datenbankdesign ist mir zu abenteuerlich - lade Dir mal die Demoversion von HS/3 runter und schau Dir deren Struktur mal an...

          Kommentar


          • #6
            Gut, vielleicht kann der TE ja mal beschreiben, welche Beziehung die Tabellen untereinander haben (sollen) .

            Kommentar


            • #7
              saison id 1:n saison preis preisliste n:1 id preisliste id 1:n preisliste zimmer

              Kommentar


              • #8
                Bin ich der einzige der aus der abwechselnd fetten und kursiven Zeile nicht schlau wird?
                Ich hatte sowas in der Richtung erwartet:
                Klasse : Schüler - 1:n
                Lehrer : Klasse - n:m
                usw.
                Die Spalten haben mit den Beziehungen der Tabellen nix zu tun, deshalb scheinen mir die "id"'s da fehlplaziert. Mein Tipp, mach unter anderem mit Zeilenumbrüchen bitte nochmal deutlich wie du dir die Beziehungen vorstellst.

                Kommentar


                • #9
                  Zitat von ChromOxid Beitrag anzeigen
                  Bin ich der einzige der aus der abwechselnd fetten und kursiven Zeile nicht schlau wird?
                  Nein, das macht alles einen absolut chaotischen Eindruck...

                  Kommentar


                  • #10
                    Es ist gängige Praxis, das bei Buchungen, die in, sich überschneidende Zeiträume fallen, generell der höchste Zimmerpreis für den gesamten Buchungszeitraum gilt.

                    Das lässt sich, was die Kategorie- oder Zimmerpreise per Saison betrifft mit einer Tabelle und ohne joins darstellen.

                    Beispieltabelle
                    Code:
                    --
                    -- Table structure for table `price`
                    --
                    
                    CREATE TABLE IF NOT EXISTS `price` (
                      `id` smallint(11) NOT NULL AUTO_INCREMENT,
                      `room_id` smallint(11) NOT NULL,
                      `date_start` date NOT NULL,
                      `date_end` date NOT NULL,
                      `amount` decimal(7,2) NOT NULL,
                      PRIMARY KEY (`id`),
                      KEY `room_id` (`room_id`)
                    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=13 ;
                    Noch ein paar Testdaten
                    Code:
                    INSERT INTO `price` (`id`, `room_id`, `date_start`, `date_end`, `amount`) VALUES
                    (1, 1, '2017-01-01', '2017-03-31', '150.00'),
                    (2, 2, '2017-01-01', '2017-03-31', '50.00'),
                    (3, 3, '2017-01-01', '2017-03-31', '200.00'),
                    (4, 1, '2017-04-01', '2017-06-30', '170.00'),
                    (5, 1, '2017-07-01', '2017-09-10', '220.00'),
                    (8, 2, '2017-04-01', '2017-06-30', '80.00'),
                    (9, 2, '2017-07-01', '2017-09-10', '100.00'),
                    (12, 3, '2017-04-01', '2017-06-30', '230.00');
                    Test
                    Es sollen die Zimmerpreise für den Zeitraum 25.03.2017 bis 02.04.2017 ausgegeben werden.
                    Code:
                    SELECT
                            `room_id` , max( `amount` ) AS `Pro Nacht`
                    FROM
                            `price`
                    WHERE
                            ('2017-03-25' BETWEEN `date_start` AND `date_end`)
                        OR  ('2017-04-02' BETWEEN `date_start` AND `date_end`)
                    GROUP BY
                            `room_id`
                    room_id Pro Nacht
                    1 170.00
                    2 80.00
                    3 230.00
                    Es soll der Übernachtungspreis für den Zeitraum 25.03.2017 bis 02.04.2017 für das Zimmer 1 ausgegeben werden inklusive der Gesamtkosten.
                    Code:
                    SELECT
                             `room_id` ,
                            '2017-03-25' AS Anreise,
                            '2017-04-02' AS Abreise,
                             max( `amount` ) AS `Pro Nacht` ,
                             8 * max( `amount` ) AS Gesamtpreis
                    FROM
                            `price`
                    WHERE
                            `room_id` = 1
                        AND (
                            ('2017-03-25' BETWEEN `date_start` AND `date_end`)
                        OR  ('2017-04-02' BETWEEN `date_start` AND `date_end`)
                        )
                    room_id Anreise Abreise Pro Nacht Gesamtpreis
                    1 2017-03-25 2017-04-02 170.00 1360.00

                    Kommentar


                    • #11
                      Schönes Beispiel. Sowas klau ich mir immer gerne mal für die Wissenssammlung.
                      The string "()()" is not palindrom but the String "())(" is.

                      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


                      • #12
                        Zitat von protestix Beitrag anzeigen
                        Es ist gängige Praxis, das bei Buchungen, die in, sich überschneidende Zeiträume fallen, generell der höchste Zimmerpreis für den gesamten Buchungszeitraum gilt.

                        Das lässt sich, was die Kategorie- oder Zimmerpreise per Saison betrifft mit einer Tabelle und ohne joins darstellen.

                        Vielen Dank für das Beispiel, ist natürlich sinnvoller, bei überschneidenden Zeiträumen den höheren Preis zu nehmen, dadurch wird das Ganze schon mal einfacher.

                        Kommentar

                        Lädt...
                        X