Requete SQL recherche
Résolu/Fermé
Christr
Messages postés
319
Date d'inscription
mercredi 15 avril 2009
Statut
Membre
Dernière intervention
19 janvier 2011
-
22 juil. 2009 à 18:28
Christr Messages postés 319 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 19 janvier 2011 - 27 juil. 2009 à 09:46
Christr Messages postés 319 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 19 janvier 2011 - 27 juil. 2009 à 09:46
A voir également:
- Requete SQL recherche
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Recherche adresse - Guide
- Recherche musique - Guide
- Recherche image - Guide
- Rechercher ou entrer l'adresse 4 - recherche google ✓ - Forum Mozilla Firefox
12 réponses
jeangilles
Messages postés
816
Date d'inscription
samedi 21 juin 2008
Statut
Membre
Dernière intervention
17 juillet 2012
186
24 juil. 2009 à 11:59
24 juil. 2009 à 11:59
Ha ben alors c'est quelquechose du genre :
SELECT DATEDIFF(p2.Date,p1.Date)
FROM `test` p1, `test` p2
WHERE p1.ID='Toto' AND p1.Etat='Absent' AND p2.ID='Toto' AND p2.Etat='Retour' and p2.Date>p1.Date and p1.Date=(SELECT max(Date) FROM test where ID='Toto' and Etat='Absent' and Date<p2.Date)
évidemment, il faut remplacer Toto par l'ID de la personne à chercher ^^
SELECT DATEDIFF(p2.Date,p1.Date)
FROM `test` p1, `test` p2
WHERE p1.ID='Toto' AND p1.Etat='Absent' AND p2.ID='Toto' AND p2.Etat='Retour' and p2.Date>p1.Date and p1.Date=(SELECT max(Date) FROM test where ID='Toto' and Etat='Absent' and Date<p2.Date)
évidemment, il faut remplacer Toto par l'ID de la personne à chercher ^^
imw
Messages postés
233
Date d'inscription
vendredi 17 juillet 2009
Statut
Membre
Dernière intervention
8 septembre 2011
42
22 juil. 2009 à 18:33
22 juil. 2009 à 18:33
SELECT count(*) FROM `Personne` WHERE ID='toto' AND Etat='Absent'
la requette te renvoi le nombre de lignes ou l'id =toto et l'etat =absent
OUPS ... mal lu la question ...
SELECT DATE_DIFF( p2.Date, p1.Date ) FROM `Personne` as p1, `Personne` as p2 WHERE p1.ID='Toto' AND p1.Etat='Absent' AND p2.ID='Toto' AND p2.Etat='Retour'
Pas testé !!!
Attention, ça ne marchera pas si tu as plusieurs fois le couple Absent/Retour pour un même ID ...
la requette te renvoi le nombre de lignes ou l'id =toto et l'etat =absent
OUPS ... mal lu la question ...
SELECT DATE_DIFF( p2.Date, p1.Date ) FROM `Personne` as p1, `Personne` as p2 WHERE p1.ID='Toto' AND p1.Etat='Absent' AND p2.ID='Toto' AND p2.Etat='Retour'
Pas testé !!!
Attention, ça ne marchera pas si tu as plusieurs fois le couple Absent/Retour pour un même ID ...
jeangilles
Messages postés
816
Date d'inscription
samedi 21 juin 2008
Statut
Membre
Dernière intervention
17 juillet 2012
186
22 juil. 2009 à 18:39
22 juil. 2009 à 18:39
Heu non, ca ca te renvoit le nombre d'entrées dans la BDD, pas le nombre de jours d'absence
faudrait faire une soustraction entre la date de retour et la date de début d'absence
mais une même personne peut être absente plusieurs fois ? (je suppose que oui ^^)
De même, une absence est elle toujours suivit d'un retour, ou peut-elle être suivie d'une autre absence ?
faudrait faire une soustraction entre la date de retour et la date de début d'absence
mais une même personne peut être absente plusieurs fois ? (je suppose que oui ^^)
De même, une absence est elle toujours suivit d'un retour, ou peut-elle être suivie d'une autre absence ?
imw
Messages postés
233
Date d'inscription
vendredi 17 juillet 2009
Statut
Membre
Dernière intervention
8 septembre 2011
42
22 juil. 2009 à 18:42
22 juil. 2009 à 18:42
Pour savoir si on peut être absent plusieurs fois, ou si 2 absences peuvent se suivre, ça, on peut pas le dire à ta place ... c'est toi qui en décide.
Quoiqu'il en soit, pour simplifier, tu devrai décomposer en plusieurs tables ... ça permettrait des recherches plus claires et plus précises
Quoiqu'il en soit, pour simplifier, tu devrai décomposer en plusieurs tables ... ça permettrait des recherches plus claires et plus précises
Christr
Messages postés
319
Date d'inscription
mercredi 15 avril 2009
Statut
Membre
Dernière intervention
19 janvier 2011
46
23 juil. 2009 à 10:02
23 juil. 2009 à 10:02
OUaaaa sa avance plein de réponce youuuuuuuouuuuuuuu
Une absence ne peut etre suivi que d'un retour pour un ID mais il peu y avoir plussieur absence d'affilé pour des id diférent
Une absence ne peut etre suivi que d'un retour pour un ID mais il peu y avoir plussieur absence d'affilé pour des id diférent
imw
Messages postés
233
Date d'inscription
vendredi 17 juillet 2009
Statut
Membre
Dernière intervention
8 septembre 2011
42
22 juil. 2009 à 18:40
22 juil. 2009 à 18:40
YEP ...
J'ai modifié mon message ...
J'ai modifié mon message ...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
jeangilles
Messages postés
816
Date d'inscription
samedi 21 juin 2008
Statut
Membre
Dernière intervention
17 juillet 2012
186
22 juil. 2009 à 18:42
22 juil. 2009 à 18:42
Oui j'ai vu plus tard ^^
mais ton code marche pas s'il y a plusieurs absenses, donc ca change rien à ma question ;)
mais ton code marche pas s'il y a plusieurs absenses, donc ca change rien à ma question ;)
imw
Messages postés
233
Date d'inscription
vendredi 17 juillet 2009
Statut
Membre
Dernière intervention
8 septembre 2011
42
22 juil. 2009 à 18:44
22 juil. 2009 à 18:44
Dans tous les cas, tu ne pourra pas avoir 1 seul résultat qui cumule la somme de toutes les périodes d'absence.
A mon avis, le mieux que l'on puisse faire, c'est de renvoyer un tableau de toutes les absences. Après reste encore à les additionner ...
A mon avis, le mieux que l'on puisse faire, c'est de renvoyer un tableau de toutes les absences. Après reste encore à les additionner ...
jeangilles
Messages postés
816
Date d'inscription
samedi 21 juin 2008
Statut
Membre
Dernière intervention
17 juillet 2012
186
22 juil. 2009 à 18:45
22 juil. 2009 à 18:45
"Dans tous les cas, tu ne pourra pas avoir 1 seul résultat qui cumule la somme de toutes les périodes d'absence. "
jsuis pas d'accord
là va falloir réfléchir un peu, mais à mon avis c'est tt à fait possible ^^
jsuis pas d'accord
là va falloir réfléchir un peu, mais à mon avis c'est tt à fait possible ^^
imw
Messages postés
233
Date d'inscription
vendredi 17 juillet 2009
Statut
Membre
Dernière intervention
8 septembre 2011
42
22 juil. 2009 à 18:57
22 juil. 2009 à 18:57
requêtes imbriquées ...
SELECT SUM( SELECT ...tableau des absence ) )
En fait, le vrai problème va quand même être de récupérer la liste de toutes les absences.
Le difficulté est de relier le retour avec l'absence précédente au sein d'une seule requête.
Il n'est pas possible lors de l'insertion du retour de rajouter un champ précisant à quelle absence il correspond ?
SELECT SUM( SELECT ...tableau des absence ) )
En fait, le vrai problème va quand même être de récupérer la liste de toutes les absences.
Le difficulté est de relier le retour avec l'absence précédente au sein d'une seule requête.
Il n'est pas possible lors de l'insertion du retour de rajouter un champ précisant à quelle absence il correspond ?
SELECT DATE_DIFF( p2.Date, p1.Date ) FROM `Personne` as p1, `Personne` as p2 WHERE p1.ID='Toto' AND p1.Etat='Absent' AND p2.ID='Toto' AND p2.Etat='Retour' AND p1.Date = date inférieure la plus proche de p2.Date
imw
Messages postés
233
Date d'inscription
vendredi 17 juillet 2009
Statut
Membre
Dernière intervention
8 septembre 2011
42
22 juil. 2009 à 19:02
22 juil. 2009 à 19:02
Un truc du genre ... peut être pas très clair ...
Je dois filer ...
mais je suis curieux du résultat ...
SELECT SUM ( SELECT DATE_DIFF( p2.Date, p1.Date ) FROM `Personne` as p1, `Personne` as p2 WHERE p1.ID='Toto' AND p1.Etat='Absent' AND p2.ID='Toto' AND p2.Etat='Retour' AND p1.Date = ( SELECT Date FROM `Personne` WHERE Date < p2.Date AND ID='Toto' AND Etat='Absent' ORDER BY Date Desc LIMIT 1 ) )
Je dois filer ...
mais je suis curieux du résultat ...
jeangilles
Messages postés
816
Date d'inscription
samedi 21 juin 2008
Statut
Membre
Dernière intervention
17 juillet 2012
186
22 juil. 2009 à 19:19
22 juil. 2009 à 19:19
J'ai essayé rapidement, avec le peu de tests que j'ai fait ca fonctionne
SELECT SUM( DATEDIFF(p2.Date,p1.Date))
FROM `test` p1, `test` p2
WHERE p1.ID='Toto' AND p1.Etat='Absent' AND p2.ID='Toto' AND p2.Etat='Retour' and p2.Date>p1.Date and p1.Date=(SELECT max(Date) FROM test where ID='Toto' and Etat='Absent' and Date<p2.Date)
SELECT SUM( DATEDIFF(p2.Date,p1.Date))
FROM `test` p1, `test` p2
WHERE p1.ID='Toto' AND p1.Etat='Absent' AND p2.ID='Toto' AND p2.Etat='Retour' and p2.Date>p1.Date and p1.Date=(SELECT max(Date) FROM test where ID='Toto' and Etat='Absent' and Date<p2.Date)
imw
Messages postés
233
Date d'inscription
vendredi 17 juillet 2009
Statut
Membre
Dernière intervention
8 septembre 2011
42
22 juil. 2009 à 22:45
22 juil. 2009 à 22:45
après petite réflexion tout à l'heure, tu peux simplifier un peu, et optimiser (toujours de tête, sans tester ...) :
Ca évite de faire un double appel à la même table dans la requête principale.
Petite curiosité : tu utilise quoi comme moteur sql ?
SELECT SUM( DATEDIFF(p.Date, (SELECT max(Date) FROM test WHERE ID='Toto' AND Etat='Absent' AND Date<p.Date) )) FROM `test` p WHERE p.ID='Toto' AND p.Etat='Retour'
Ca évite de faire un double appel à la même table dans la requête principale.
Petite curiosité : tu utilise quoi comme moteur sql ?
Christr
Messages postés
319
Date d'inscription
mercredi 15 avril 2009
Statut
Membre
Dernière intervention
19 janvier 2011
46
23 juil. 2009 à 10:06
23 juil. 2009 à 10:06
Le moteur SQl est MySQL 5.0.45
je vais essayé sa de suite et je reviens vers vous
je vais essayé sa de suite et je reviens vers vous
Christr
Messages postés
319
Date d'inscription
mercredi 15 avril 2009
Statut
Membre
Dernière intervention
19 janvier 2011
46
24 juil. 2009 à 11:43
24 juil. 2009 à 11:43
La commande ne fonctionne pas il me retourne NULL
je vais vous ré expliqué plus clairement ce qui me gène
La requete dois effectuer les paramètre suivant après avoir sélectionné un id et une plage de date
je souhaiterais conaitre le nombre de jour ou mr X à été absent entre le 2009-07-01 00:00:00 jusqu'au 2009-08-01 00:00:00
donc un affichage de l'id et du nombre de jour d'absence
dans le cas ou Mr X est revenue le 15 à 00:00:00 je devrai voir afficher
14 = Mr X
cependant il ce peu que Mr X ne revienne que le 2009-08-10 00:00:00 donc je devrais voir affiché
31 = Mr X
sa c'est la première partie
la seconde est celle que je désire trouvé graçe a votre aide présieuse
c'est si Mr X est absent du 2009-08-01 00:00:00 au 2009-08-06 00:00:00 et est a nouveau absent le 2009-08-08 00:00:00 au 2009-11-01 00:00:00 et encore du 2009-08-20 00:00:00 au 2009-08-22 00:00:00
alors je voudrais voir afficher
5 = Mr X
2 = Mr X
1 = Mr X
Est ce que cela vous à aidé à comprendre mon maudit problème
je vais vous ré expliqué plus clairement ce qui me gène
La requete dois effectuer les paramètre suivant après avoir sélectionné un id et une plage de date
je souhaiterais conaitre le nombre de jour ou mr X à été absent entre le 2009-07-01 00:00:00 jusqu'au 2009-08-01 00:00:00
donc un affichage de l'id et du nombre de jour d'absence
dans le cas ou Mr X est revenue le 15 à 00:00:00 je devrai voir afficher
14 = Mr X
cependant il ce peu que Mr X ne revienne que le 2009-08-10 00:00:00 donc je devrais voir affiché
31 = Mr X
sa c'est la première partie
la seconde est celle que je désire trouvé graçe a votre aide présieuse
c'est si Mr X est absent du 2009-08-01 00:00:00 au 2009-08-06 00:00:00 et est a nouveau absent le 2009-08-08 00:00:00 au 2009-11-01 00:00:00 et encore du 2009-08-20 00:00:00 au 2009-08-22 00:00:00
alors je voudrais voir afficher
5 = Mr X
2 = Mr X
1 = Mr X
Est ce que cela vous à aidé à comprendre mon maudit problème
imw
Messages postés
233
Date d'inscription
vendredi 17 juillet 2009
Statut
Membre
Dernière intervention
8 septembre 2011
42
25 juil. 2009 à 08:04
25 juil. 2009 à 08:04
A mon avis, c'est pas possible sur 1 seule requête !
On a vu qu'il est possible de calculer les intervalles à condition d'avoir un début et une fin.
Là, tu demande les intervalles contenus dans une période précise, avec en plus le souhait d'avoir les parcelles d'intervalles et début ou en fin de période (donc, coupé au milieu).
Il faudrait faire en plusieurs étapes (a voir comment l'intégrer en sql)
1 - récupérer les absences entières
2 - tester si il y a une absence en cours le premier jour -> définir le nombre de jours qu'il reste
3 - tester si il y a une absence en cours le dernier jour -> définir le nombre de jours déjà écoulés
4 - additionner le tout
On a vu qu'il est possible de calculer les intervalles à condition d'avoir un début et une fin.
Là, tu demande les intervalles contenus dans une période précise, avec en plus le souhait d'avoir les parcelles d'intervalles et début ou en fin de période (donc, coupé au milieu).
Il faudrait faire en plusieurs étapes (a voir comment l'intégrer en sql)
1 - récupérer les absences entières
2 - tester si il y a une absence en cours le premier jour -> définir le nombre de jours qu'il reste
3 - tester si il y a une absence en cours le dernier jour -> définir le nombre de jours déjà écoulés
4 - additionner le tout
Christr
Messages postés
319
Date d'inscription
mercredi 15 avril 2009
Statut
Membre
Dernière intervention
19 janvier 2011
46
27 juil. 2009 à 09:46
27 juil. 2009 à 09:46
Merci ça fonctionne bien
voici ma commande grâce à vous
SELECT p1.site, p1.date AS Absent, p2.date AS Retour, TIMEDIFF( p2.date, p1.`date` ) AS duree
FROM etat p1,etat p2
WHERE p1.site LIKE '%H%'
AND p1.site = p2.site
AND p1.etat LIKE 'Absent'
AND p2.site LIKE '%H%'
AND p2.etat = 'Retour'
AND p2.date > p1.date
AND p1.date = (
SELECT max( p.date )
FROM etatp
WHERE site LIKE '%H%'
AND etat = 'Absent'
AND p.date < p2.date )
AND p1.date
BETWEEN '2009-06-01 00:00:00'
AND '2009-07-31 00:00:00'
AND p2.date
BETWEEN '2009-06-01 00:00:00'
AND '2009-07-31 00:00:00'
ORDER BY p1.site, duree
voici ma commande grâce à vous
SELECT p1.site, p1.date AS Absent, p2.date AS Retour, TIMEDIFF( p2.date, p1.`date` ) AS duree
FROM etat p1,etat p2
WHERE p1.site LIKE '%H%'
AND p1.site = p2.site
AND p1.etat LIKE 'Absent'
AND p2.site LIKE '%H%'
AND p2.etat = 'Retour'
AND p2.date > p1.date
AND p1.date = (
SELECT max( p.date )
FROM etatp
WHERE site LIKE '%H%'
AND etat = 'Absent'
AND p.date < p2.date )
AND p1.date
BETWEEN '2009-06-01 00:00:00'
AND '2009-07-31 00:00:00'
AND p2.date
BETWEEN '2009-06-01 00:00:00'
AND '2009-07-31 00:00:00'
ORDER BY p1.site, duree