Tester: SQL Abfrage

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?

  1. 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

    1. 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

      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

      1. 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";

  2. 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