Unknown column 'maxdatum' in 'where clause'
lachesis
- datenbank
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
sorry falsches Thema!!
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
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
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