Ich habe zwei Tabellen mit einer Eins-zu-viele-Beziehung.Erhalte Daten mit MAX (Datum) <X
Table1
ID name email
Table2
ID table1_ID date
Ich brauche die Daten alle aus Tabelle 1 erhalten where
:
MAX(date) from Table2 < "2016-01-01"
Das funktioniert nicht. Max wird in where-Klausel als "ungültig" betrachtet. Was ich tat war:
SELECT Table1.name, Table1.email, tmp.maxdate
FROM Table1
JOIN ( SELECT MAX(date) maxdate, table1_ID
FROM Table2
GROUP BY table1_ID) as tmp
ON tmp.table1_ID = table1.id
WHERE tmp.maxdate < "2016-01-01"
AND (other conditions)
So funktioniert das. ABER ich denke, die Leistung wird schrecklich sein - explain
zeigt, dass alle Table2
gelesen wird, und diese Tabelle wird viel wachsen.
Irgendeine Idee, wie ich es sonst tun könnte, oder wie ich meine aktuellen Abfrageleistungen verbessern könnte?
Warum denken Sie, dass die Leistung schrecklich ist? –
Es ist ein wenig merkwürdig, dass Sie tmp mit table1 verknüpfen, anstatt den Zwischenschritt für die Verknüpfung von tmp mit Tabelle 2 einzuschließen. Außerdem würde ich die WHERE-Klausel in die Unterabfrage einfügen. Abgesehen davon, sollte diese Abfrage extrem schnell indiziert sein. – Strawberry
Da 'MAX (Datum)' eine Aggregation ist, kann es nicht in 'WHERE' eingefügt werden, sondern gehört stattdessen zu' HAVING'. Wie auch andere darauf hingewiesen haben, können Sie anstelle von 'HAVING MAX (date)> '2016-01-01'' einfach' WHERE date>' 2016-01-01'' verwenden. –