C'est parce que vous faites un cast implicite d'un datetime mysql vers un entier.
Par exemple. mysql pense que l'heure (au moment où j'écris ceci) est 2011-12-15 13:42:10 mais si je demandais à mysql de soustraire 90 de cela, cela entraînerait 20111215134210 - 90 =20111215134120 qui est 13:41:20 Qui est 50 il y a quelques secondes.
Soit traitez l'heure comme un entier (en convertissant vers/à partir d'un horodatage unix, comme suggéré par liquorvicar) ou utilisez les fonctions de date pour faire des calculs sur une valeur de date :
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;
(notez que j'ai également réécrit la dernière expression de filtre de sorte que la colonne de la table soit isolée d'un côté de l'expression - ce qui présente un petit avantage en termes de vitesse lorsque la colonne n'est pas indexée, mais un énorme avantage lorsqu'elle est indexée).
Ou en utilisant les secondes depuis l'époque...
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);
(qui évidemment ne pourra pas utiliser l'optimisation de l'index).