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 :

[MySQL]Requête select avec double classement


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut [MySQL]Requête select avec double classement
    Bonjour à tous !

    J'ai un petit problème, je n'arrive pas à écrire une certaine requête.
    Je vous expose le problème :

    Ma table est comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    T_TABLE(personne_id, personne_status, personne_date)
    Tout simplement.

    J'aimerais récupérer tous les enregistrements qui satisfont ces contraintes :

    - personne_date <= 'Une date D1'
    - je ne veux pas 2 enregistrements tel que enregistrement1.personne_id = enregistrement2.personne_id
    - et enfin je veux les enregistrements tel que personne_date soit le plus proche possible de 'Une date D1'


    En résumé, je veux un seul enregistrement par personne et que la date soit la plus proche de Date D1 sans dépasser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM T_TABLE WHERE PERSONNE_DATE <= 'D1' ORDER BY PERSONNE_DATE DESC
    Cette requête me renvoie bien les enregistrements avec personne_date le plus proche de date D1 mais rien ne me garantit que pour chaque personne_id de n'avoir qu'un seul enregistrement.

    Pensez vous que cela soit possible en une seule requête??

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Citation Envoyé par GyZmoO Voir le message
    Pensez vous que cela soit possible en une seule requête??
    Probablement, quoiqu'avec une sous-requête.
    Peut-il y avoir deux lignes pour la même personne_id avec la même personne_date ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Yop !

    Effectivement, j'ai oublié de préciser, c'est impossible qu'il y'ait deux enregistrements possédant le même personne_id et le même personne_date :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    ALTER TABLE T_TABLE ADD UNIQUE IDX1 (PERSONNE_ID, PERSONNE_DATE);

  4. #4
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Donc effectivement je pense qu'avec cette sous-requête corrélée, ça doit le faire
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT T1.*
    FROM T_TABLE T1
    WHERE T1.personne_date=
    (SELECT MAX(T2.personne_date)
    from T_TABLE T2
    WHERE T2.personne_ID=T1.personne_ID
    AND T2.personne_date<='D1')
    ORDER BY T1.personne_date DESC
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Great ! Je teste ça demain et je tiens au jus !

    Merci

  6. #6
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Salut !

    Bon, la requête fait ce que je veux !! It's a good new !
    Mais, cette table contenant 1 000 000 de lignes c'est relativement lent :'(

    En fait cette requête est dans une appli Java.

    Et j'ai 2 options :

    - Soit faire cette requête qui récupère toutes les lignes qui satisfont ces contraintes :

    * personne_id = x1 or personne_id = x2...
    * and personne_date <= 'D1'

    je récupère un truc de ce style
    personne_id, personne_date, personne_status
    1 D1 0
    1 D2 0
    1 D3 0
    2 D1 0 etc...

    D1,D2 et D3 étant bien sur <= D1

    Cette requête ne me garantit pas que pour une personne_id je n'aurais qu'une seule ligne....

    Donc sans récupérer le max en terme de date

    Et après faire un traitement en java pour récupérer effectivement juste la dernière ligne (en terme de date) pour chaque personne_id .

    - Soit faire la requête citée plus haut et comme ça après dans mon appli java j'ai pas de traitement à faire.

    Mais la 1ère technique est plus rapide.

    Y'a t-il un moyen de faire en sorte que la 2nde requête soit plus rapide? Utiliser une jointure sur la même table? Mais, même en utilisant une jointure, je ne vois pas comment faire pour me passer de la sous requête qui fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    where T1.personne_date = (SELECT MAX(T2.personne_date))....

    En tout cas merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requête select avec un if imbriqué
    Par celiaaa dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 05/12/2006, 14h32
  2. Requête SELECT avec concaténation et masque
    Par Someonelse dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/09/2006, 16h10
  3. Requête SELECT avec deux champs dans une colonne ??
    Par fredhali2000 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 08/06/2006, 10h41
  4. Requête selection avec une variable de date
    Par kahmsin dans le forum Access
    Réponses: 7
    Dernier message: 20/11/2005, 19h38
  5. [Débutant] Requête SELECT avec max et sous-requête
    Par joefou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/07/2005, 14h28

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