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 gebuchtTabelle projektnr
id pnr pname kid(zeigt auf kunden.id) iid gedeckt soll closeTabelle 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