43 votes

select from mysql table between datetime x min ago and datetime x min ago

Je crois que j'ai bien résumé la situation dans le titre. Je veux sélectionner les utilisateurs en ligne d'une heure spécifique à une autre heure spécifique. Mon tableau 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 le 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.

91voto

Mark Byers Points 318575

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 le faire respecter).

Si un nom d'utilisateur peut apparaître plusieurs fois dans la table, il vous suffit d'ajouter DISTINCT après SELECT pour votre première requête, mais vous devez adopter 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
)

26voto

OMG Ponies Points 144785

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) 

les 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) 

Le traitement des doublons entraîne des frais supplémentaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X