Svarene fra @jjclarkson og @davehegr8 er tæt på, men du kan ikke sætte aggregerede funktioner i WHERE-sætningen. WHERE-udtrykket evalueres for hver række.
Du skal evaluere MAX()
udtryk for hver gruppe, så du skal bruge en HAVING
klausul.
Prøv dette:
SELECT UserID
FROM ArrivalTimes
GROUP BY UserID
HAVING MAX(ArrivalTime) <= '09:00:00';
@MBCook kommenterer, at HAVING
kan være langsom. Du har ret, det er måske ikke den absolut hurtigste måde at producere det ønskede resultat på. Men HAVING
løsningen er den mest klare . Der er situationer, hvor ydeevne har lavere prioritet end klarhed og vedligeholdelse.
Jeg så på EXPLAIN-outputtet (på MySQL 5.1.30) for HAVING
løsning:ingen indekser blev brugt, og de ekstra bemærkninger sagde "Using temporary; Using filesort
," hvilket normalt betyder, at ydeevnen vil være dårlig.
Overvej følgende forespørgsel:
SELECT DISTINCT a1.UserID
FROM ArrivalTimes a1
LEFT OUTER JOIN ArrivalTimes a2
ON (a1.UserID = a2.UserID AND a2.ArrivalTime > '09:00:00')
WHERE a2.UserID IS NULL;
Dette genererer en optimeringsplan, der bruger et indeks på UserID
og siger:
- a1:"
Using index; Using temporary
" - a2:"
Using where; Distinct
"
Endelig genererer den følgende forespørgsel en optimeringsplan, der ser ud til at bruge indekser mest effektivt og ingen midlertidige tabeller eller filsortering.
SELECT DISTINCT a1.UserID
FROM ArrivalTimes a1
WHERE NOT EXISTS (SELECT * FROM ArrivalTimes a2
WHERE a1.UserID = a2.UserID
AND a2.ArrivalTime > '09:00:00');
- a1:"
Using where; Using index
" - a2:"
Using where
"
Dette ser ud til at have den bedste ydeevne. Indrømmet, jeg har kun fire rækker i min testtabel, så dette er ikke en repræsentativ test.