SQL Abfrage
Tester
- datenbank
Abfrage auf Server direct funktioniert, aber nicht als PHP Aufruf.
Dann SQL-Fehlermeldung:
SELECT hotel.id AS hotelid , zimmer.id AS zimmerid , belegungen.id AS belegungenid FROM hotel LEFT JOIN zimmer ON zimmer.hotelid = hotel.id LEFT JOIN belegungen ON (zimmer.id = belegungen.roomid) WHERE hotel.ort='7'AND hotel.land='11' AND hotel.agb != '' AND hotel.storno != '' AND (zimmer.status ='1' OR zimmer.status = '2') AND NOT EXISTS ( SELECT belegungen.roomid, belegungen.mindauer AS minfalse, belegungen.status AS statusfalse FROM belegungen, zimmer WHERE zimmerid
= belegungen.roomid AND ((( belegungen.buchstart <= '1215576001' AND belegungen.buchend >= '1215576001') OR ( belegungen.buchstart <= '1216267201' AND belegungen.buchend >= '1216267201')) OR (belegungen.buchstart > '1215576001' AND belegungen.buchend < '1216267201')) AND ( belegungen.mindauer > '8' OR belegungen.status = '3' ))
Unknown column 'zimmerid' in 'where clause'
Ich will mit der über den Join geholten zimmerid weiterarbeiten, wie gesagt auf dem Server direct funktioniert das, mit dem gewünschten Ergebnis.
Wenn ich zimmer.id nehmen würde, ist das Ergebnis für jedes Hotel leer, sobald für ein Hotel die Bedingung nicht zutrifft!
Hat jemand einen TIPP?
Ich will mit der über den Join geholten zimmerid weiterarbeiten, wie gesagt auf dem Server direct funktioniert das, mit dem gewünschten Ergebnis.
Wenn ich zimmer.id nehmen würde, ist das Ergebnis für jedes Hotel leer, sobald für ein Hotel die Bedingung nicht zutrifft!Hat jemand einen TIPP?
Unknown column 'zimmerid' in 'where clause'
Das heisst dass es diese Feld nicht gibt. Auch wenn du am Anfang bei SELECT sagtst "zimmer.id AS zimmerid" kannst du nicht in derselben Abfrage auf zimmerid zugreifen sondern solltest dann wieder über
NEU: zimmer WHERE zimmer.id = belegungen.roomid (Auszug aus deiner Abfrage)
ALT: zimmer WHERE zimmerid
= belegungen.roomid
gehen.
Gruß Matt
Ich will mit der über den Join geholten zimmerid weiterarbeiten, wie gesagt auf dem Server direct funktioniert das, mit dem gewünschten Ergebnis.
Wenn ich zimmer.id nehmen würde, ist das Ergebnis für jedes Hotel leer, sobald für ein Hotel die Bedingung nicht zutrifft!Hat jemand einen TIPP?
Unknown column 'zimmerid' in 'where clause'
Das heisst dass es diese Feld nicht gibt. Auch wenn du am Anfang bei SELECT sagtst "zimmer.id AS zimmerid" kannst du nicht in derselben Abfrage auf zimmerid zugreifen sondern solltest dann wieder über
NEU: zimmer WHERE zimmer.id = belegungen.roomid (Auszug aus deiner Abfrage)
ALT: zimmer WHERE
zimmerid
= belegungen.roomidgehen.
Gruß Matt
Danke für den Hinweis!
Aber dann liefert das Ergebnis Null auch direct auf dem
Server, wie ich schon schrieb. Dagegen funktioniert die Abrage mit zimmerid auf dem Server so, das die gewünschten Datensätze ohne Fehlermeldung geliefert werden. Auch muss ich in der Unterselectabfrage nicht mal die Tabelle zimmer angeben, weil der Server die zimmerid aus der Join noch hat.
Wo liegt der Unterschied Server Html/bzw. PHP -Aufruf? Andere Sicherheitsbestimmungen?
Nochmals Danke Der Tester
echo $begrüßung;
Ich will mit der über den Join geholten zimmerid weiterarbeiten, wie gesagt auf dem Server direct funktioniert das, mit dem gewünschten Ergebnis.
Wenn ich zimmer.id nehmen würde, ist das Ergebnis für jedes Hotel leer, sobald für ein Hotel die Bedingung nicht zutrifft!
Unknown column 'zimmerid' in 'where clause'
Das heisst dass es diese Feld nicht gibt. Auch wenn du am Anfang bei SELECT sagtst "zimmer.id AS zimmerid" kannst du nicht in derselben Abfrage auf zimmerid zugreifen [...]
Aber dann liefert das Ergebnis Null
Wenn du zimmer.id im Subquery notierst, greift es auf die Tabelle zimmer des Subquery zu. Du möchtest stattdessen den Wert aus dem äußeren Statement. Der steht jedoch beim WHERE noch nicht zur Verfügung. Die WHERE-Klasel schränkt erst die vom FROM (inklusive JOIN) gelieferte Datenmenge ein, bevor es die Spalten des SELECT berechnet. Du kannst auf Gegebenheiten im SELECT keinen Bezug nehmen. Erst ab der HAVING-Klausel ist das möglich.
auch direct auf dem Server, wie ich schon schrieb. Dagegen funktioniert die Abrage mit zimmerid auf dem Server so, das die gewünschten Datensätze ohne Fehlermeldung geliefert werden.
Du widersprichst dir gerade. Selbst wenn das erste PHP heißen sollte, gänge diese Abfrage auch auf dem Server nicht.
Auch muss ich in der Unterselectabfrage nicht mal die Tabelle zimmer angeben, weil der Server die zimmerid aus der Join noch hat.
Wenn aus dem Join ein zimmerid hervorgeht, dann ist das aber nicht das "zimmer.id AS zimmerid" aus dem SELECT sondern ein anderes.
Wo liegt der Unterschied Server Html/bzw. PHP -Aufruf? Andere Sicherheitsbestimmungen?
Nein, die SQL-Syntax unterliegt keinen Sicherheitsbstimmungen. Den Unterschied zwischen der Anfrage, die du über PHP gesendet hast und der direkt verwendeten wirst du sicher sehen, wenn du genau hinschaust.
Hat jemand einen TIPP?
Mach es den potenziellen Antwortenden leichter, indem du das Statement lesbarer formatierst als den Buchstabenhaufen aus dem OP. Beispielsweise so:
SELECT
hotel.id AS hotelid,
zimmer.id AS zimmerid,
belegungen.id AS belegungenid
FROM hotel
LEFT JOIN zimmer ON zimmer.hotelid = hotel.id
LEFT JOIN belegungen ON (zimmer.id = belegungen.roomid)
WHERE
hotel.ort = '7' AND
hotel.land = '11' AND
hotel.agb != '' AND
hotel.storno != '' AND
(zimmer.status = '1' OR zimmer.status = '2') AND
NOT EXISTS (
SELECT
belegungen.roomid,
belegungen.mindauer AS minfalse,
belegungen.status AS statusfalse
FROM belegungen, zimmer
WHERE
zimmerid
= belegungen.roomid AND
(((belegungen.buchstart <= '1215576001' AND belegungen.buchend >= '1215576001') OR
(belegungen.buchstart <= '1216267201' AND belegungen.buchend >= '1216267201')) OR
(belegungen.buchstart > '1215576001' AND belegungen.buchend < '1216267201')) AND
(belegungen.mindauer > '8' OR belegungen.status = '3')
)
echo "$verabschiedung $name";
Problem selbst gelöst, Unter-Abfrage umgestellt:
AND NOT EXISTS ( SELECT * FROM belegungen WHERE zimmer.id = belegungen.roomid AND ((( belegungen.buchstart <= '1215576001' AND belegungen.buchend >= '1215576001') OR ( belegungen.buchstart <= '1216267201' AND belegungen.buchend >= '1216267201')) OR (belegungen.buchstart > '1215576001' AND belegungen.buchend < '1216267201')) AND ( belegungen.mindauer > '8' OR belegungen.status = '3' ))
nun nimmt auch das Script die zimmer.id aus dem Join!
Danke für die Denkhilfe!
Der Tester