lachesis: Unknown column 'maxdatum' in 'where clause'

Hallo,

ich versuche folgende Query, um mir die Projektnummern
anzeigen zu lassen, die in einem Intervall, von heute zurückgerechnet, verwendet wurden:

SELECT pid, pname, name, pnr, max( datum )  AS 'maxdatum'
FROM stunden, projektnr, kunden
WHERE pid = projektnr.id AND
      kid = kunden.id AND
      close = 0 AND
      'maxdatum' > ( date_sub( current_date,  INTERVAL 1  DAY  )  )
GROUP  BY pid
ORDER  BY maxdatum

Als Ergebnis krieg ich...

pid  pname  name  pnr  maxdatum
70   XXXXX  BSH   XXX  2002-01-07
.
.
.

Das ist doch eindeutig falsch oder?

Warum?

Danke

--
mal wieder auf http://www.booklinks.de vorbeigeschaut? Mittlerweile mehr als 900! Bücher.
  1. sorry falsches Thema!!

    --
    mal wieder auf http://www.booklinks.de vorbeigeschaut? Mittlerweile mehr als 900! Bücher.
  2. Hallo,

    ich versuche folgende Query, um mir die Projektnummern
    anzeigen zu lassen, die in einem Intervall, von heute zurückgerechnet, verwendet wurden:

    SELECT pid, pname, name, pnr, max( datum )  AS 'maxdatum'

    Wofür sind die Anführungsstriche da?

    FROM stunden, projektnr, kunden
    WHERE pid = projektnr.id AND
          kid = kunden.id AND

    Das ist ein Join.

    close = 0 AND

    Das ist eine Bedingung, welche die gejointe Datensatzgruppe einschränkt.

    'maxdatum' > ( date_sub( current_date,  INTERVAL 1  DAY  )  )

    Das ist eine Bedingung, welche die gruppierte Datensatzgruppe einschrnke soll. Das geht hier noch nicht.

    GROUP  BY pid

    Hier wird nämlich erst gruppiert.

    ORDER  BY maxdatum

    SELECT pid, pname, name, pnr, max(datum) AS maxdatum
    FROM stunden, projektnr, kunden
    WHERE pid = projektnr.id AND
          kid = kunden.id AND
          close = 0
    GROUP BY pid
    HAVING maxdatum > (date_sub(current_date, INTERVAL 1 DAY))
    ORDER BY maxdatum

    Davon abgesehen, würde ich die Joins auch als INNER JOIN schreiben. Um das zu zeigen, fehlen mir aber Informationen zur Tabellenstruktr.

    viele Grüße

    Axel

    1. Hallo,

      danke für die Erklärung, so hab sogar ich das verstanden! :-)
      Und so funktioniert das auch.

      Ich hatte auch das Gefühl, dass diese Abfrage so von hinten durchs Knie ist..

      Die Struktur wäre so:

      Tabelle stunden
      id pid(zeigt auf projektnr.id) uid stunden datum pruef gebucht

      Tabelle projektnr
      id pnr pname kid(zeigt auf kunden.id) iid gedeckt soll close

      Tabelle kunden
      id name

      Danke für Deine Hilfe

      --
      mal wieder auf http://www.booklinks.de vorbeigeschaut? Mittlerweile mehr als 900! Bücher.
      1. Hallo,

        Ich hatte auch das Gefühl, dass diese Abfrage so von hinten durchs Knie ist..

        Nö, das kann man so machen. Meine Meinung ist nur, dass man für Joins auch die SQL-JOIN-Syntax verwenden sollte. Das macht das Statement eindeutiger.

        Die Struktur wäre so:

        Tabelle stunden
        id pid(zeigt auf projektnr.id) uid stunden datum pruef gebucht

        Tabelle projektnr
        id pnr pname kid(zeigt auf kunden.id) iid gedeckt soll close

        Tabelle kunden
        id name

        SELECT pid, pname, name, pnr, max(datum) AS maxdatum
        FROM stunden, projektnr, kunden
        WHERE pid = projektnr.id AND
              kid = kunden.id AND
              close = 0
        GROUP BY pid
        HAVING maxdatum > (date_sub(current_date, INTERVAL 1 DAY))
        ORDER BY maxdatum

        bringt das gleiche Ergebnis wie:

        SELECT pid, pname, name, pnr, max(datum) AS maxdatum
        FROM (stunden INNER JOIN projektnr ON stunden.pid = projektnr.id) INNER JOIN kunden ON projektnr.kid = kunden.id
        WHERE projektnr.close = 0
        GROUP BY pid
        HAVING maxdatum > (date_sub(current_date, INTERVAL 1 DAY))
        ORDER BY maxdatum

        Je nach Datenbanksystem wäre zu prüfen, bzw. in der Doku nachzulesen, welche Variante schneller ist. Viele DBS haben, wenn die relevanten Felder indexiert sind, Optimierungsroutinen für JOIN implementiert. Bei älteren MySQL-Versionen gab es mal ein Problem  mit INNER JOIN. Da _muss_ dann die WHERE-Variante verwendet werden.

        viele Grüße

        Axel