IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

requete select avec date


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15
    Points : 10
    Points
    10
    Par défaut requete select avec date
    Bonjour,

    j'essaie de faire une requete en une seule fois mais je n'y parviens pas, il s'agit d'une requete sur des cotisants, je voudrai récupérer la date de fin de derniere cotisation d'une personne comprise entre aujourd'hui et une date antérieure
    pour les essais, j'ai fixé la date à un mois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    table cot_cotisation
    cot_id clé primaire
    etu_id -> identifiant d'une personne
    cot_dateCotisation
    cot_dateDebutCotisation -> date de début de la cotisation
    cot_dateFinCotisation -> date de fin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    cot_id etu_id  cot_dateFinCotisation
    1 	50002 	2003-07-15
    2 	50002 	2004-07-16
    3 	50002 	2005-07-17
    4 	50002 	2006-07-18
    5 	50002 	2007-07-19
    6 	50003 	2001-09-05
    7 	50003 	2002-09-06
    8 	50003 	2003-09-07
    9 	50003 	2004-09-08
    dans mon esprit la requete ressemblerait à celle du dessous mais le problème c'est qu'elle me sort les date de fin de cotisation qui ne sont pas les dernieres effectuées par la personne exemple (4 50002 2006-07-18) que j'ai mis en rouge au dessus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT etu_id, max( cot_dateFinCotisation )
    FROM `cot_cotisation`
    WHERE cot_dateFinCotisation < '2006-08-02'
    AND cot_dateFinCotisation > '2006-07-02'
    GROUP BY etu_id
    je voulais donc savoir si c'etait possible en une seule requete ou s il fallait utiliser les sous requetes que je ne maitrise pas.

  2. #2
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    Bonjour,

    Oui c'est possible sans sous-requête, par contre peux-tu donner ce qui est renvoyé par ta requête sur ce jeu de test s'il te plaît ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    bonjour, merci pour ta réponse, alors voici la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT cot_id, etu_id, max( cot_dateFinCotisation )
    FROM `cot_cotisation`
    WHERE cot_dateFinCotisation < '2006-08-02'
    AND cot_dateFinCotisation > '2006-07-02'
    GROUP BY etu_id
    et les premiers résultats que j'ai eu
    les résultats que j'ai mis en vert sont bons, en fait j'ai rempli ma table en considérant que chaque utilisateur avait fait 5 cotisations donc lorsque cot_id finit par 5 ou 0, il s'agit de la derniere cotisation, évidemment je ne peux pas utiliser ça lorsque la requete sera juste étant donné que le nombre variera selon les utilisateurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cot_id  etu_id  max( cot_dateFinCotisation)
    4 	50002 	2006-07-18
    160 	50033 	2006-07-20
    209 	50043 	2006-07-20
    280 	50057 	2006-07-16
    353 	50072 	2006-07-16
    365 	50074 	2006-07-18
    508 	50103 	2006-07-18
    649 	50131 	2006-07-18
    744 	50150 	2006-07-13
    805 	50162 	2006-07-18
    829 	50167 	2006-07-10

  4. #4
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    Hum, il y a un truc qui reste obscure. Si la cinquième date est la plus tardive, tu dis que c'est la bonne réponse. Mais comment peut-elle l'être si elle est en 2007 alors que la requête concerne la période du 02/07/2006 au 02/08/2006 ?

    Pour moi, ta requête correspond à ce que tu veux... enfin je crois.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    en fait, la requete doit me permettre de récuperer les utilisateurs dont la validité de la cotisation est inférieure à un mois par rapport à la date du jour. c'est à dire que si l'utilisateur a renouvelé sa cotisation jusqu'à 20/07/2007 et que sa précédente cotisation finissait le 19/07/2006, je ne veux pas qu il apparaisse dans les resultats de ma recherche. par contre si sa cotisation s'arrete au 16/07/2006, il doit apparaitre.

    donc les seuls resultats qui auraient du sortir sont celle des dernieres cotisations et non d'une cotisation qui entre dans les resultats de recherche mais qui aurait été renouvelé depuis.

    je ne sais pas si je suis clair.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    160 	50033 	2006-07-20
    280 	50057 	2006-07-16
    365 	50074 	2006-07-18
    805 	50162 	2006-07-18

  6. #6
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    peux tu réexpliquer en utilisant de SI et les champs de la table stp ?

  7. #7
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Bonjour,

    Citation Envoyé par druglord
    l'utilisateur a renouvelé sa cotisation jusqu'à 20/07/2007 et que sa précédente cotisation finissait le 19/07/2006, je ne veux pas qu il apparaisse dans les resultats de ma recherche. par contre si sa cotisation s'arrete au 16/07/2006, il doit apparaitre.
    Tu veux les cotisations arrivant à échéance et non renouvelées ? Si j'ai compris, essaies ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT	d.etu_id,
    	MIN(d.cot_dateFinCotisation) AS "expire le" 
    FROM 	cot_cotisation d
    LEFT JOIN cot_cotisation f
    ON 	d.etu_id = f.etu_id
    AND	f.cot_dateFinCotisation > '2006/08/02'
    WHERE	d.cot_dateFinCotisation > '2006/07/02'
    AND	d.cot_dateFinCotisation < '2006/08/02'
    AND	f.cot_dateFinCotisation IS NULL
    GROUP BY d.etu_id
    ORDER BY d.etu_id,
    	"expire le"
    A +

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    je vous remercie de votre aide, la requete fonctionne .

    Pensez vous maintenant qu'il est possible de l'optimiser soit en la réécrivant d'une autre manière ou en utilisant des index sur certains champs car elle met 7-8 secondes à s'executer pour 13 000 lignes dans la table cot_cotisation. Je pense que c'est une table qui depassera 70 000 lignes avec le temps.

  9. #9
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    merci, c'est good !

Discussions similaires

  1. [VB.NET]Requete SELECT avec un Like
    Par krfa1 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 09/01/2007, 17h24
  2. [SQL] Requete sql avec dates
    Par SergeF dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/03/2006, 16h53
  3. probleme requete select avec 2 colonnes
    Par cricri45000 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/04/2005, 10h39
  4. requete select avec AS remplacement de valeur
    Par pi3141563 dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/04/2004, 22h15
  5. requete SELECT avec un nombre constant
    Par gurumeditation dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/07/2003, 20h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo