php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 11-08-2003, 09:30
Wilhelm
 Newbie
Links : Onlinestatus : Wilhelm ist offline
Registriert seit: Aug 2003
Beiträge: 37
Wilhelm ist zur Zeit noch ein unbeschriebenes Blatt
Standard [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?
Mit Zitat antworten
  #2 (permalink)  
Alt 11-08-2003, 09:42
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

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...
Mit Zitat antworten
  #3 (permalink)  
Alt 11-08-2003, 10:07
Wilhelm
 Newbie
Links : Onlinestatus : Wilhelm ist offline
Registriert seit: Aug 2003
Beiträge: 37
Wilhelm ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #4 (permalink)  
Alt 11-08-2003, 10:12
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

tausch die datumsangaben mal
__________________
Ich denke, also bin ich. - Einige sind trotzdem...
Mit Zitat antworten
  #5 (permalink)  
Alt 11-08-2003, 10:36
Wilhelm
 Newbie
Links : Onlinestatus : Wilhelm ist offline
Registriert seit: Aug 2003
Beiträge: 37
Wilhelm ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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.
Mit Zitat antworten
  #6 (permalink)  
Alt 11-08-2003, 10:41
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

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...
Mit Zitat antworten
  #7 (permalink)  
Alt 11-08-2003, 10:52
Wilhelm
 Newbie
Links : Onlinestatus : Wilhelm ist offline
Registriert seit: Aug 2003
Beiträge: 37
Wilhelm ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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?
Mit Zitat antworten
  #8 (permalink)  
Alt 11-08-2003, 10:54
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

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

duhast deine datumsangaben schon in hochkommas stehen oder?
Zitat:
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...
Mit Zitat antworten
  #9 (permalink)  
Alt 11-08-2003, 11:01
Wilhelm
 Newbie
Links : Onlinestatus : Wilhelm ist offline
Registriert seit: Aug 2003
Beiträge: 37
Wilhelm ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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";
Mit Zitat antworten
  #10 (permalink)  
Alt 11-08-2003, 11:03
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

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...
Mit Zitat antworten
  #11 (permalink)  
Alt 11-08-2003, 11:36
Wilhelm
 Newbie
Links : Onlinestatus : Wilhelm ist offline
Registriert seit: Aug 2003
Beiträge: 37
Wilhelm ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #12 (permalink)  
Alt 11-08-2003, 11:43
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

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...
Mit Zitat antworten
  #13 (permalink)  
Alt 11-08-2003, 11:58
Wilhelm
 Newbie
Links : Onlinestatus : Wilhelm ist offline
Registriert seit: Aug 2003
Beiträge: 37
Wilhelm ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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

Geändert von Abraxax (11-08-2003 um 12:16 Uhr)
Mit Zitat antworten
  #14 (permalink)  
Alt 11-08-2003, 12:03
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

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...
Mit Zitat antworten
  #15 (permalink)  
Alt 11-08-2003, 12:09
Wilhelm
 Newbie
Links : Onlinestatus : Wilhelm ist offline
Registriert seit: Aug 2003
Beiträge: 37
Wilhelm ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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.

Geändert von Wilhelm (11-08-2003 um 12:57 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

Projektmanagement Damals und Heute
Projektmanagement Damals und HeuteWerfen Sie einen Blick auf das, was sich verändert hat, und entdecken Sie, wo die Zukunft dieses Gebietes hinsteuert.

18.01.2021 | Berni

Arbeitsmanagement-Tools
Arbeitsmanagement-ToolsWarum jedes Team Arbeitsmanagement-Tools benötigt. Man schätzt, dass 25% eines durchschnittlichen Mitarbeiter-Tages durch ineffiziente Arbeit vergeudet werden.

11.12.2020 | Berni


 

Aktuelle PHP Scripte

PHP Newsletter Script SuperWebMailer ansehen PHP Newsletter Script SuperWebMailer

Die webbasierte PHP Newsletter Software SuperWebMailer ist die optimale Lösung zur Durchführung eines erfolgreichen E-Mail-Marketings. Zur Nutzung des PHP Script-Pakets ist eine eigene Webpräsenz/Server mit PHP 5 oder neuer, MySQL 4 oder neuer und die

29.04.2021 mirko_swm | Kategorie: PHP/ Mail
OXID eShop

Mit OXID eshop bieten wir Ihnen eine modulare und skalierbare Internet Shopping Software mit einem hervorragenden Preis-/Leistungsverhältnis.

29.04.2021 eric.jankowfsky@ | Kategorie: PHP/ Shops
PHP-Login

Die Aufgabenstellung bestand darin, ein einfaches Login-Script zu erstellen, dass schnell und universell auf jeder Webseiten eingebaut werden kann. Der Schwerpunkt lag dabei auf der Entwicklung eines universell einsetzbarem Modul für den Login und zur

05.04.2021 Wallhalla | Kategorie: PHP/ Kundenverwaltung
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 02:52 Uhr.