Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/01/2011, 11h48   #1
Invité de passage
 
Inscription : octobre 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 3
Points : 1
Points : 1
Par défaut Comparaison entre lignes d'une même table.

Bonjour à tous,

J'ai un traitement à faire sur une table, que je pourrais faire avec une petite application, mais je cherche à savoir si il est possible de faire la même chose directement en SQL.

Voici mon problème :

J'ai une table qui me sert à log la connexion d'ordinateurs. Une petite appli tourne sur chaque machine qui les fait se connecter environ toutes les minutes et insérer une nouvelle ligne avec le nom et l'heure (table 'log', champs 'log_name','log_datetime').

La requête que je cherche à faire permettrai de répondre à cette question : "dans les 48 heures passé, y-a-t-il eu une absence de connexion de plus de 5 minutes ?" .

Si je passais par une application, ca ne serais pas bien compliqué, une requête pour récupérer les entrées des dernières 48h, trié par nom et date, et il suffit de parcourir le résultat en faisant la différence de temps entre 2 lignes pour chaque machine. Mais faire l'équivalent en sql, je ne vois pas trop ...

Merci de votre aide.
jules700 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 14h12   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 985
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 985
Points : 18 232
Points : 18 232
Envoyer un message via MSN à CinePhil
Citation:
"dans les 48 heures passé, y-a-t-il eu une absence de connexion de plus de 5 minutes ?" .
Quel est le datetime suivant une connexion ?
Code :
1
2
3
4
5
6
SELECT a.log_name, a.log_datetime, MIN(b.log_datetime) AS datetime_suivant
FROM log a
LEFT OUTER JOIN log b 
    ON b.log_name = a.log_name
    AND b.log_datetime > a.log_datetime
GROUP BY a.log_name, a.log_datetime
Comme tu ne veux que les absences de connexions de plus de 5 minutes dans les dernières 48h, on ne va retenir que les connexions intervenues entre - 48 h et - 5mn1s.
Code :
1
2
3
4
5
6
7
SELECT a.log_name, a.log_datetime, MIN(b.log_datetime) AS datetime_suivant
FROM log a
LEFT OUTER JOIN log b 
    ON b.log_name = a.log_name
    AND b.log_datetime > a.log_datetime
WHERE a.log_datetime BETWEEN DATE_SUB(CURRENT_TIME, INTERVAL 48 HOUR) AND DATE_SUB(CURRENT_TIME, INTERVAL 301 SECOND)
GROUP BY a.log_name, a.log_datetime
Maintenant, on ne retient que les connexions inactives pendant plus de 5 minutes ou celles qui n'ont pas eu de connexion suivante.
Code :
1
2
3
4
5
6
7
8
9
10
SELECT a.log_name, a.log_datetime, MIN(b.log_datetime) AS datetime_suivant
FROM log a
LEFT OUTER JOIN log b 
    ON b.log_name = a.log_name
    AND b.log_datetime > a.log_datetime
WHERE a.log_datetime BETWEEN DATE_SUB(CURRENT_TIME, INTERVAL 48 HOUR) AND DATE_SUB(CURRENT_TIME, INTERVAL 301 SECOND)
GROUP BY a.log_name, a.log_datetime
HAVING MIN(b.log_datetime) IS NULL
    OR DATE_ADD(a.log_datetime, INTERVAL 5 MINUTE) < MIN(b.log_datetime)
ORDER BY a.log_name, a.log_datetime
À essayer.
Combien t'aurait-il fallu de lignes pour faire la même chose dans un langage de programmation ? Et combien de temps pour le développer et le tester ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 11h36   #3
Invité de passage
 
Inscription : octobre 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 3
Points : 1
Points : 1
Merci pour ton aide, je vais essayer ceci
jules700 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2011, 10h42   #4
Invité de passage
 
Inscription : octobre 2010
Messages : 3
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 3
Points : 1
Points : 1
Je n'avais pas eu le temps de tester avant, mais ca fonctionne parfaitement (à par qu'il faut utiliser NOW() plutot que CURRENT_TIME), merci beaucoup.
jules700 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h49.


 
 
 
 
Partenaires

Hébergement Web