Axel Richter: Unknown column 'maxdatum' in 'where clause'

Beitrag lesen

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