Je pense que je l'ai bien résumé dans le titre. Je souhaite sélectionner des utilisateurs en ligne d'une heure spécifique à une autre heure spécifique. Ma table ressemble à ceci:
CREATE TABLE online (
id bigint(20) NOT NULL auto_increment,
`username` varchar (16) NOT NULL,
`ip` varchar(39) NOT NULL default '',
`time` datetime NOT NULL default '0000-00-00 00:00:00' ,
PRIMARY KEY (id)
);
Je veux une requête qui renvoie les username
qui ont été en ligne les last 15 minutes
.
Et une requête pour les utilisateurs qui ont été en ligne le last 60 minutes, but not the last 15 minutes
. Les requêtes ne renvoient donc pas les mêmes valeurs. Je ne sais pas comment faire.
Pour votre première requête:
SELECT username
FROM online
WHERE time > NOW() - INTERVAL 15 MINUTE
Et pour votre deuxième:
SELECT username
FROM online
WHERE time BETWEEN NOW() - INTERVAL 60 MINUTE AND NOW() - INTERVAL 15 MINUTE
Ces deux requêtes supposent que chaque utilisateur n'apparaît qu'une seule fois dans la table en ligne (et si c'est effectivement le cas, vous devez ajouter une contrainte UNIQUE pour appliquer cela).
Si un nom d'utilisateur peut apparaître plusieurs fois dans le tableau, il vous suffit d'ajouter DISTINCT après SELECT pour votre première requête, mais vous avez besoin d'une approche légèrement différente pour votre deuxième requête:
SELECT DISTINCT username
FROM online
WHERE time > NOW() - INTERVAL 60 MINUTE
AND NOT EXISTS
(
SELECT *
FROM online
WHERE time > NOW() - INTERVAL 15 MINUTE
)
Utilisez DATE_SUB pour soustraire le temps du DATETIME renvoyé par NOW ():
SELECT o.*
FROM ONLINE o
WHERE o.time >= DATE_SUB(NOW(), INTERVAL 15 MINUTE)
SELECT o.*
FROM ONLINE o
WHERE o.time BETWEEN DATE_SUB(NOW(), INTERVAL 60 MINUTE)
AND DATE_SUB(NOW(), INTERVAL 15 MINUTE)
Frais de manutention en double en sus.