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

PHP & Base de données Discussion :

Extraction mysql dernière date en fonction de valeurs


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 57
    Par défaut Extraction mysql dernière date en fonction de valeurs
    bonjour à tous,

    Je souhaite exécuter une requête mysql qui trie les résultats comme expliqué ci-dessous :

    J'ai une table qui se nomme 'Historique' dans laquelle est stocké un historique complet d'interventions sur différents matériels.

    Dans cette table j'ai entre autres les colonnes suivantes : Localisation, Type matériel, Type intervention et date intervention.

    Exemple :

    Localisation | Typemat | Typeinter | Dateinter
    lieu1| mat1 | vérif | 18/08/2009
    lieu1| mat1 | vérif |19/04/2006
    lieu1 | mat1 |vérif | 19/02/2003
    lieu1 | mat1 | révis | 14/01/2008
    lieu1 | mat1 | révis | 14/02/2011
    lieu1 | mat1 | révis |17/08/2005
    lieu1 | mat2 | vérif | 18/08/2009
    lieu1 | mat2 | vérif | 19/04/2006
    lieu2 | mat1 | vérif |19/02/2003
    lieu2 | mat1 | vérif | 14/01/2008
    lieu2 | mat3 | révis | 14/02/2011
    lieu2 | mat3| révis | 17/08/2005


    Quand je fais une extraction de ces données dans php, je souhaiterais que ma requête ne prenne en compte seulement la date la plus récente en fonction du type d'intervention.

    Dans cette exemple je voudrais que ma requête sorte donc les lignes suivantes :

    Localisation | Typemat | Typeinter | Dateinter
    lieu1 | mat1 | vérif | 18/08/2009

    lieu1 | mat1 | révis | 14/02/2011

    lieu1 | mat2 | vérif | 18/08/2009

    lieu2 | mat1 | vérif |14/01/2008

    lieu2 | mat3| révis | 14/02/2011


    Voilà, merci pour votre aide

  2. #2
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Pour classer / ordonner des données ça se fait avec ORDER BY.
    Comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT champ
    FROM une_table
    WHERE une_condition = 'truc'
    ORDER BY Localisation ASC, Dateinter ASC
    Cependant, le classement désiré risque d'être difficile à obtenir (voir impossible) du fait que tu utiliserais des noms (des chaines) au niveau des champs.
    Comme "Typeinter" -> vérif, révis, etc ...

    Le classement sera fait selon l'alphabet : Un a sera avant un b pour un ordre ascendant par exemple.
    Théoriquement, il aurait fallut des identifiants, (un champ id_typeinter par exemple), et une table à part pour y mettre les différents Typeinter (champ : id_typeinter, nom par exemple).

    Faut espérer aussi que les formats de date ici sont justes pour exemple, c'est à dire que dans la Bdd c'est bien un champ de type DATE et un format comme 2009-08-18 (au lieu de 18/08/2009).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 57
    Par défaut
    D'accord, merci pour ta réponse, effectivement ça risque de compliquer la chose.

    sinon si je fais un "order by date desc", y'a-t-il une fonction me permettant en sql ou en php de demander que les répétitions soient ignorées.

    comme ça sql va chercher mes interventions en les classant par date décroissante et si j'ai des localisations, typemat et typeinter qui se sont similaires il ne prendrait que la première date trouvée et ignorerait les autres.

    merci

  4. #4
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    sinon si je fais un "order by date desc", y'a-t-il une fonction me permettant en sql ou en php de demander que les répétitions soient ignorées.
    Ca se fait avec GROUP BY (des regroupements).

    Exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT champ
    FROM une_table
    WHERE une_condition = 'truc'
    GROUP BY Localisation
    ORDER BY Dateinter ASC
    Cependant, et si je ne dis pas de bêtises, les regroupements sont quelques peu aléatoires, disons que le classement du ORDER BY est indépendant des regroupements (ou inversement).
    C'est un peu normal aussi, car si on regroupe, ça sous entend quelles seraient les mêmes.

    En faite, si on prend exemple avec un regroupement sur la "Localisation", dans ton exemple on a 8 lieu1, ça va éliminer 7 et donc en conserver qu'un.
    La ligne conservée devrait être la 1ère qui a été insérée (la plus ancienne en quelque sorte).
    Idem pour le lieu2.

    C'est après que l'ordre va s'appliquer sur les 2 lignes retenues (lieu1 et lieu2) selon la date (si on classe par date).


    Je ne sais pas si tu vois.
    Mais le mieux c'est de faire des essais.
    Post la requête au besoin.

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,
    Citation Envoyé par RunCodePhp Voir le message
    Cependant, et si je ne dis pas de bêtises, les regroupements sont quelques peu aléatoires
    Euh, non. Par contre il est tout à fait possible d'ordonner un GROUP BY en faisant ainsi :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY oneField ASC|DESC

  6. #6
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Citation Envoyé par rawsrc
    Par contre il est tout à fait possible d'ordonner un GROUP BY en faisant ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY oneField ASC|DESC
    Je ne le savais pas.
    C'est bon à savoir.
    Merci pour l'info.

  7. #7
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Par défaut
    Salam ;
    Quand je fais une extraction de ces données dans php, je souhaiterais que ma requête ne prenne en compte seulement la date la plus récente en fonction du type d'intervention.

    Dans cette exemple je voudrais que ma requête sorte donc les lignes suivantes :

    Localisation | Typemat | Typeinter | Dateinter
    lieu1 | mat1 | vérif | 18/08/2009

    lieu1 | mat1 | révis | 14/02/2011

    lieu1 | mat2 | vérif | 18/08/2009

    lieu2 | mat1 | vérif |14/01/2008

    lieu2 | mat3| révis | 14/02/2011
    je ne c'est qu est ce que voulez vous dire par dates récentes 2008 , 2009....!!!!
    si vos vous interventions sont quotidiennes , je vous propose de faire des requêtes paramétrées avec param: date sa donne plus de vie et de flexibilité a votre application...

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 57
    Par défaut
    J'ai testé, ça me sort un résultat mais pas ce que je recherche.

    Je me suis résilié à faire plus simple donc j'exporte ma table en CSV et sous excel je fais un tri décroissant par date et je renvoi tout dans mysql (à l'origine mes données venaient d'un fichier excel).
    Ainsi quand je fais un GROUP BY Concatener, vu que le premier élément trouvé est gardé en référence, il tombe forcément sur la date la plus récente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM Historique
    GROUP BY Concatener
    ORDER BY Loc, Ensemble, RepUnifilaire
    Le seul inconvénient c'est que 2 ou 3 fois par an je dois extraire la table sous excel et réorganiser les dates mais bon ça n'est pas un travail conséquent non plus.

    En tout cas encore merci pour votre aide à tous

  9. #9
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    à l'origine mes données venaient d'un fichier excel
    Je m'en doutais un peu.

    Mais le problème que tu rencontre est essentiellement lié au fait que tout ce trouve dans une seule et unique table, alors qu'une base de données ça se conçoit, en plus, ça ne se conçoit pas n'importe comment.

    Mettre tout dans une seule table ça n'a pas de sens.
    Si on a des rubriques, et que pour 1 rubrique il y a des articles qui sont associés, ça débouche sur 2 tables.
    C'est le BABA dans ce domaine là, et cela qui fera qu'on pourra exploiter convenablement et facilement le SQL.

    Si à la source le fichier excel n'est pas correctement structuré en plusieurs tables/colonnes, donc toutes les données dans 1 seule tableau comme tu le montre, alors le travail risque fort d'être long de créer cette Bdd convenablement.

    Si cette fois ce fichier excel est bien structuré convenablement, il doit avoir moyen de le faire évoluer, des faire des tableaux croisés dynamique de la même manière qu'une base de donnée.
    Excel intègre d'ailleurs une notion de base de données.
    Tout devrait pouvoir ce faire à ce niveau, ce qui au bout facilitera l'export de ces données vers une Bdd comme MySQL.

    Peut être d'ailleurs qu'au lieu d'exploiter Excel, il serait préférable d'utiliser Access, ce qui faciliterait encore plus l'export vers MySQL normalement.
    Faudrait même voir l'usage, car rien ne dit ici que MySQL soit la Bdd la plus adaptée.
    Faut voir.


    Toujours est t-il qu'il y a une erreur à mon sens quelque part dans la façon de faire.
    De mon coté, j'ai tout simplement arrêter de me creuser la tête sur ton problème pour la simple raison que j'estime que c'est une pure perte de temps de tenter de trouver une solution sur une table quelque peu "fourre tout".
    (je ne dis pas ça méchamment bien entendu, juste un constat.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 57
    Par défaut
    Si ça peut aider quelqu'un on m'a donné la solution à mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    SELECT 
       h1.*
    FROM 
       historique h1
          INNER JOIN (
             SELECT 
                historique.`Concatener`, 
                historique.`TypeIntervention`, 
                MAX(historique.DateIntervention) AS MaxDate
             FROM 
                historique
             GROUP BY 
                historique.`Concatener`, 
                historique.`TypeIntervention`            
          ) AS h2 ON h1.`Concatener` = h2.Concatener 
                     AND h1.`TypeIntervention` = h2.`TypeIntervention`
                     AND h1.`DateIntervention` = h2.`MaxDate`
    GROUP BY
       h1.`Concatener`, 
       h1.`TypeIntervention`
    ORDER BY
       h1.`Concatener`,
       h1.`DateIntervention` DESC
    Je sais qu'il faudrait que j'améliore ma bdd, je vais m'y mettre après avoir appri quelques trucs car c'est un peu brouillon mais en attendant ça fonctionne comme je le souhaitais.

Discussions similaires

  1. Recherche de date en fonction d'une seule valeur
    Par rousskoff dans le forum Excel
    Réponses: 3
    Dernier message: 06/03/2012, 22h51
  2. Réponses: 3
    Dernier message: 03/11/2010, 15h18
  3. [MySQL] Mysql Requête UPDATE en fonction d'une date
    Par xunil2003 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 27/03/2010, 03h20
  4. Dernière date de modification d'une fonction
    Par haykelFST dans le forum Développement
    Réponses: 1
    Dernier message: 26/11/2008, 21h57
  5. Réponses: 4
    Dernier message: 28/03/2007, 13h16

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