Det beror på att du gör en implicit cast från en mysql datetime till ett heltal.
T.ex. mysql tror att tiden (när jag skriver detta) är 2011-12-15 13:42:10 men om jag bad mysql att subtrahera 90 från detta, skulle det träna 20111215134210 - 90 =20111215134120 vilket är 5:13:vilket är 5:13:sekunder sedan.
Behandla tiden som ett heltal (genom att konvertera till/från en unix-tidsstämpel, enligt förslaget av liquorvicar) eller använd datumfunktionerna för att räkna ut ett datumvärde:
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;
(observera att jag också har skrivit om det sista filteruttrycket så att tabellkolumnen är isolerad på ena sidan av uttrycket - vilket har en liten hastighetsfördel när kolumnen inte är indexerad men en enorm fördel när den är indexerad).
Eller med sekunder-sedan-epok...
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 uppenbarligen inte kommer att kunna använda indexoptimering).