php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 16.08.2011, 13:25  
Erfahrener Benutzer
 
Benutzerbild von Arne Drews
 
Registriert seit: 22.04.2009
Beiträge: 3.486
PHP-Kenntnisse:
Anfänger
Arne Drews wird schon bald berühmt werdenArne Drews wird schon bald berühmt werden
Arne Drews eine Nachricht über Skype™ schicken
Standard [Erledigt] allgemeine Frage Belegungsplan Ferienwohnung

Mich würde mal allgemein Eure Meinung interessieren.
Ich bin an einem Belegungsplan für FeWo´s dran und arbeite gerade an der DB.

Meine Frage bezieht sich auf die freien Zeiten der einzelnen Wohnungen.

Grundlage
Es exisiteren bereits die Tabellen für die Wohnungen, Häuser und Preise.
Nun geht es um die Tabelle für die Belegungen.

Vorraussetzung
Es soll eine Suchmaske ausfüllbar sein, (Personenanzahl, Wunschtermin, etc.) und nach Absenden eine Liste der Wohnungen/Häuser angezeigt werden, die zu dem gewünschten Zeitpunkt frei wären.

Mein Ansatz
Ich würde jetzt eine Tabelle erstellen, um die Zeiten für die einzelnen Wohnungen und Häuser über deren ID´s zu verwalten.
Dazu hatte ich mir überlegt, nur die belegten Daten einzutragen (Anreise- und Abreisedatum), um anhand der Zeiträume festzustellen, ob ein eingegebens Datum im Bereich eines der belegten liegt.

Frage
Ist das sinnvoll oder würdet Ihr das anders lösen? Evtl. freie Zeiten eintragen? Aber da habe ich mir gedacht, wäre der administrative Aufwand deutlich höher.

Würde mich mal interessieren, ob Ihr das ähnlich machen würdet oder sogar komplett anders?
thx
__________________
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
Albert Einstein
Arne Drews ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 16.08.2011, 13:33  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

also bei so etwas gibts grundsätzlich 3 Fälle zu bedenken - aber ich glaub das weißt du auch ...

1) Start-Termin (Wunsch) liegt innerhalb eines Belegten Zeitraums
2) End-Termin(Wunsch) liegt innerhalb eines Belegten Zeitraums
3) Start-Termin liegt VOR,End-Termin NACH einem belegten Zeiraum ....

ansonsten würd ich das Design genauso machen

die Einzelnen Belegungen würde ich über eine Zuordnungstabelle verwalten
Code:
ID              integer auto_increment primary key
FeWoID          integer, fremdschlüssel zur Tabelle der Ferienwohnungen
start_belegung  DateTime oder Date
Ende_Belegung   DateTime oder Date
dann schaust du halt, ob du mit dem Wunschtermin gemäß der obigen Liste einen Treffer für eine FerienWohnungID landest.

Bei allen Ferienwohnungen, die übrig bleiben, wendest du dann noch deine übrigen Filter an ( genügend Betten / Räume / Pool zwingend usw) und hast so die Liste der zur Verfügung stehenden Ferienwohnungen, die den Wünschen des Besuchers entsprechen
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 16.08.2011, 13:38  
Erfahrener Benutzer
 
Benutzerbild von Arne Drews
 
Registriert seit: 22.04.2009
Beiträge: 3.486
PHP-Kenntnisse:
Anfänger
Arne Drews wird schon bald berühmt werdenArne Drews wird schon bald berühmt werden
Arne Drews eine Nachricht über Skype™ schicken
Standard

Ah... Danke, den dritten Fall hatte ich tatsächlich noch nicht berücksichtigt.
Aber ist natürlich logisch.

Strukturell sieht meine Zuordnungstabelle so aus, wie Dein Vorschlag.

Ok, das hilft mir weiter, Danke Dir!
__________________
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
Albert Einstein
Arne Drews ist offline   Mit Zitat antworten
Alt 26.08.2011, 11:39  
Erfahrener Benutzer
 
Benutzerbild von Arne Drews
 
Registriert seit: 22.04.2009
Beiträge: 3.486
PHP-Kenntnisse:
Anfänger
Arne Drews wird schon bald berühmt werdenArne Drews wird schon bald berühmt werden
Arne Drews eine Nachricht über Skype™ schicken
Standard

Ich fräch nochma´ kurz wat´ kosmetisches...

Passt alles soweit und per zwei SQL-Anweisungen bekomme ich auch alle richtigen Wohnungen ausgegeben.
Ich frage mich nur, ob ich es evtl. auch über eine einzige SQL-Anweisung lösen kann/sollte?!

So sieht die erste der beiden einzelnen Anweisungen im Detail aus:
Code:
# alle Wohnungen für 4 Personen, mit mind. 2 Schlafzimmern und erlaubten Haustieren

SELECT a.house, a.location, b.apartementNr, b.max_person, b.bedrooms, b.id
FROM `houses` AS a
  JOIN `apartements` AS b ON a.id = b.house
WHERE b.max_person = 4
  AND b.bedrooms >= 2
  AND b.dogs = 1
Die zweite Abfrage sucht mir nur die Wohnungen, die zu dem angegebenen Zeitraum NICHT belegt sind.

Folgenden Versuch habe ich unternommen, um die beiden SQL-Anweisungen mal zu einer zu "mergen" (testweise nur 1 Datum!):
Code:
# (wie oben) + angegebenes Datum nicht belegt

SELECT a.house, a.location, b.apartementNr, b.max_person, b.bedrooms, b.id
FROM `houses` AS a
  JOIN `apartements` AS b ON a.id = b.house
  LEFT JOIN `occupied` AS c ON b.id = c.apartement_id
WHERE b.max_person = 4
  AND b.bedrooms >= 2
  AND b.dogs = 1
  AND '2011-08-26' NOT BETWEEN c.arrival AND c.departure
Das er mir jetzt natürlich auf Grund der Beziehungen generell nur die Wohnungen anzeigt, die in der Belegungstabelle `occupied` einen Eintrag haben, ist klar.

Frage: Bekomme ich das über EINE SQL-Anweisung hin, daß er mir auch alle anderen anzeigt?
Also die, die nicht belegt sind, stehen in der Tabelle `occupied` gar nicht drin, von daher sollen die ja mit ins Raster "unbelegt" fallen...

Falls keine Ideen kommen, kein Problem. Es funktioniert ja über zwei Anweisungen, daher lass ich mal "Erledigt" angehakt...
__________________
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
Albert Einstein
Arne Drews ist offline   Mit Zitat antworten
Alt 26.08.2011, 12:26  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

du brauchst du die "obere" Abfrage gar nicht ...

reagiere einfach auf den Fall , dass beim Left JOIN eines der Felder aus occupied NULL meldet (und bitte eins, dass dort NIE Null sein kann - wie zum Bleistift der Primärschlüssel)

denn Left Join "bringt" doch bei allen Datensätzen wo zum Fremdschlüssel kein Datensatz existiert die Felder der Join-Tabelle mit NULL belegt ins Ergebnis

darauf "reagieren" kannst du beispielsweise mit IF im SQL - oder eben auf PHP-Seite
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 26.08.2011, 14:08  
Erfahrener Benutzer
 
Benutzerbild von Arne Drews
 
Registriert seit: 22.04.2009
Beiträge: 3.486
PHP-Kenntnisse:
Anfänger
Arne Drews wird schon bald berühmt werdenArne Drews wird schon bald berühmt werden
Arne Drews eine Nachricht über Skype™ schicken
Standard

Hi eagle,

Danke, daß Du nochmal unterstützt. Also soweit ist das eh klar.
Was ich nicht ganz verstehe:
Zitat:
du brauchst du die "obere" Abfrage gar nicht ...
Vielleicht sollte ich dazu sagen, wie das Suchformular aufgebaut ist:

1. Anreisewunsch
2. Abreisewunsch
3. Anzahl Personen
4. Anzahl Schlafzimmer
5. Haustiere erlaubt

Unter Berücksichtigung aller Faktoren, soll er mir die Wohnungen ausgeben, die in dem gewünschten Bereich frei sind.
Daher benötige ich die obere doch, oder täusche ich mich?

Zitat:
reagiere einfach auf den Fall , dass beim Left JOIN eines der Felder aus occupied NULL meldet
Ja, aber ich komm nicht drauf, wie ich das mit den anderen Aspekten in einer einzigen SQL-Anweisung unterbringe...

Habe es mal so aufgebaut, dann erhalte ich allerdings ein komplett leeres Ergebnis:
Code:
SELECT a.house, a.location, b.apartementNr, b.max_person, b.bedrooms, b.id
FROM `houses` AS a
  JOIN `apartements` AS b ON a.id = b.house
  LEFT JOIN `occupied` AS c ON b.id = c.apartement_id
WHERE b.max_person = 4
  AND b.bedrooms >= 2
  AND b.dogs = 1
  AND c.id != NULL
  AND '2011-08-25' NOT BETWEEN c.arrival AND c.departure
...ich hatte zuerst auch c.id NOT NULL, aber da bekam ich Syntax Error near...
Oder meinst Du das anders, mit auf den Fall NULL reagieren?

Danke!

Beitrag editiert:
Oha... Habe Deinen letzten Satz eben erst gelesen, klar ich bastel mal'n IF in das Statement.
Teste ich gleich...
__________________
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
Albert Einstein
Arne Drews ist offline   Mit Zitat antworten
Alt 26.08.2011, 14:44  
Erfahrener Benutzer
 
Benutzerbild von Arne Drews
 
Registriert seit: 22.04.2009
Beiträge: 3.486
PHP-Kenntnisse:
Anfänger
Arne Drews wird schon bald berühmt werdenArne Drews wird schon bald berühmt werden
Arne Drews eine Nachricht über Skype™ schicken
Standard

man man man...
Code:
SELECT a.house, a.location, b.apartementNr, b.max_person, b.bedrooms, b.id
FROM `houses` AS a
  JOIN `apartements` AS b ON a.id = b.house
  LEFT JOIN `occupied` AS c ON b.id = c.apartement_id
WHERE b.max_person = 4
  AND b.bedrooms >= 2
  AND b.dogs = 1
  AND IF (c.id = NULL, 1, 0) = '2011-08-25' NOT BETWEEN c.arrival AND c.departure
So bekomme ich das gleiche Ergebnis, als wenn ich IF weglasse, was mir logisch gesehen auch klar ist.
Aber wie meinst Du soll ich "reagieren". Da komm' ich grad nicht drauf...
__________________
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
Albert Einstein
Arne Drews ist offline   Mit Zitat antworten
Alt 26.08.2011, 14:48  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

na die Wohnung als "frei" dem Kunden anbieten *grins*

damit reagierst du doch schon passend ...
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 26.08.2011, 14:52  
Erfahrener Benutzer
 
Benutzerbild von Arne Drews
 
Registriert seit: 22.04.2009
Beiträge: 3.486
PHP-Kenntnisse:
Anfänger
Arne Drews wird schon bald berühmt werdenArne Drews wird schon bald berühmt werden
Arne Drews eine Nachricht über Skype™ schicken
Standard

Hmmm... Also es gibt Wohnungen, die in der occupied noch nicht drin stehen, die erfasse ich mit der Syntax eben noch nicht, da ist mein Problem.
Dirty Workaround wäre natürlich jede Wohnung einmal mit Datum vom bspw. 1.1.1970 bis 1.1.1970 in die Tabelle einzutragen, dann würde das gehen...
Aber ist das clever

Beitrag editiert:
Ok, so funktionierts nun in einer Anweisung. Habe die etwas umgestellt und per IF "reagiert".
Code:
SELECT a.id, c.house, c.location, a.apartementNr
FROM apartements AS a
LEFT JOIN occupied AS b ON a.id = b.apartement_id
JOIN houses AS c ON a.house = c.id
WHERE a.max_person >= 4
  AND a.bedrooms = 2
  AND a.dogs = 1
  AND IF (b.id=NULL, 1, ('2011-08-25' NOT BETWEEN b.arrival AND b.departure))
Danke eagle für die Hilfestellung!
__________________
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
Albert Einstein

Geändert von Arne Drews (26.08.2011 um 15:52 Uhr). Grund: klappt doch...
Arne Drews ist offline   Mit Zitat antworten
Alt 26.08.2011, 15:55  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

du musst doch deine Where-Bedingung nur noch um den Fall erweitern denn :
Code:
 AND IF (c.id = NULL, 1, 0) = '2011-08-25' NOT BETWEEN c.arrival AND c.departure
damit stellst du ja nur sicher, dass du ausschließlich bei Vorhandenen Einträgen in occupied dort mit Datum suchst - du brauchst passend dazu den Fall dass c.id=NULL ist - denn dann ist die Wohnung garantiert frei, weil noch nie vermietet

Code:
 AND (  (IF (c.id = NULL, 1, 0) = '2011-08-25' NOT BETWEEN c.arrival AND c.departure )  OR 
   ( c.id is NULL ) 
  )
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Allgemeine Frage zum Schlüsselwort: this Thalo JavaScript, Ajax und mehr 5 24.04.2010 23:45
Allgemeine Frage zu Ladezeiten / PHP Versionen 22hase PHP Tipps 2010 42 26.01.2010 15:49
Frage zu mysql_insert_id 22hase Datenbanken 15 30.12.2009 16:22
Allgemeine Frage programmübergreifend IIYTII PHP Tipps 2009 4 18.09.2009 21:03
Allgemeine Frage Programmübergreifend IIYTII PHP Tipps 2009 5 18.09.2009 13:29
Frage zum technischen Aufbau einer Seite mit Loginsystem gammlo PHP Tipps 2009 13 09.07.2009 22:04
URL Frage Eclipse16V PHP Tipps 2009 8 23.02.2009 17:02
Allgemeine Frage zu SQL Abfragen in PHP 22hase PHP Tipps 2009 19 16.02.2009 20:07
Hallo eine Frage in sachen Forensysteme spikytux HTML, Usability und Barrierefreiheit 11 03.01.2009 15:06
Allgemeine Frage 22hase PHP Tipps 2008 2 30.10.2008 18:26
Dringende Frage odde PHP Tipps 2008 5 28.10.2008 19:03
[Erledigt] Allgemeine Frage robydog PHP Tipps 2008 40 15.06.2008 18:41
[Erledigt] Frage zur Funkrionen? PHP Tipps 2004-2 10 01.12.2004 09:42
[Erledigt] Allgemeine Frage zu MySQL/SQL ;) Datenbanken 9 22.10.2004 14:15
[Erledigt] Frage! PHP Tipps 2004 4 27.07.2004 11:25

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
belegungsplan php mysql anreise abreise, belegkalender php mysql, sql belegungsplan, belegungsplan php, php ferienwohnung, belegkalender ajax mysql, belegungsplan fewo php mysql, php mysql select belegungskalender, php script fewo, freie zeiträume abfragen anreise abreise php, freie zeiträume abfragen anreise abreise, belegungsplan ferienwohnung datenbank, belegungsplan php uhrzeiten, ferienwohnung belegungskalender mysql, kostenlose tips belegungsplan erstellen, php belegungsplan, belegungsplan sql, mysql,ferienwohnung,belegungsplan, ajax belegungsplan, ferienwohnung buchungskalender php

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:40 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum