Det er fordi du laver en implicit cast fra en mysql datetime til et heltal.
For eksempel. mysql mener, at tiden (som jeg skriver dette) er 2011-12-15 13:42:10, men hvis jeg bad mysql om at trække 90 fra dette, ville det træne 20111215134210 - 90 =20111215134120, hvilket er 5:13:sekunder siden.
Behandl enten tiden som et heltal (ved at konvertere til/fra et unix-tidsstempel, som foreslået af liquorvicar) eller brug datofunktionerne til at lave matematik på en datoværdi:
SELECT *,
timediff(NOW(), attempt_time) diff,
timediff(NOW(), attempt_time + INTERVAL 90 SECONDS) pending,
NOW() nw
FROM failed_login
WHERE (username = 'some_username'
OR attempt_ip = '127.0.0.1')
AND NOW() - INTERVAL 90 SECONDS > attempt_time;
(bemærk, at jeg også har omskrevet det sidste filterudtryk, så tabelkolonnen er isoleret på den ene side af udtrykket - hvilket har en lille hastighedsfordel, når kolonnen ikke er indekseret, men en kæmpe fordel, når den er indekseret).
Eller ved at bruge sekunder-siden-epoken...
SELECT *,
UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(attempt_time) diff,
UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(attempt_time) + 90 pending,
NOW() nw
FROM failed_login
WHERE (username = 'some_username'
OR attempt_ip = '127.0.0.1')
AND UNIX_TIMESTAMP(NOW()) - 90 > UNIX_TIMESTAMP(attempt_time);
(som naturligvis ikke vil kunne bruge indeksoptimering).