web-dev-qa-db-fra.com

sélectionner dans la table mysql entre datetime x min ago et datetime x min ago

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.

32
ganjan

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
)
75
Mark Byers

Utilisez DATE_SUB pour soustraire le temps du DATETIME renvoyé par NOW ():

15 dernières minutes

SELECT o.*
  FROM ONLINE o
 WHERE o.time >= DATE_SUB(NOW(), INTERVAL 15 MINUTE) 

60 dernières minutes, mais pas les 15 dernières minutes

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.

18
OMG Ponies