Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum 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 09/01/2012, 19h36   #1
Invité de passage
 
Inscription : mai 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 24
Points : 0
Points : 0
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
illidan05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2012, 20h13   #2
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 728
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 728
Points : 3 295
Points : 3 295
Salut

Pour classer / ordonner des données ça se fait avec ORDER BY.
Comme :
Code :
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).
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 12h39   #3
Invité de passage
 
Inscription : mai 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 24
Points : 0
Points : 0
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
illidan05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 14h36   #4
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 728
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 728
Points : 3 295
Points : 3 295
Citation:
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 :
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.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 18h17   #5
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
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 :
GROUP BY oneField ASC|DESC
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2012, 20h56   #6
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 728
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 728
Points : 3 295
Points : 3 295
Citation:
Envoyé par rawsrc
Par contre il est tout à fait possible d'ordonner un GROUP BY en faisant ainsi :
Code :
GROUP BY oneField ASC|DESC
Je ne le savais pas.
C'est bon à savoir.
Merci pour l'info.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2012, 13h02   #7
Membre expérimenté
 
Avatar de redoran
 
Homme
Developpeur- Amateur
Inscription : juin 2010
Messages : 982
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 40
Localisation : Algérie

Informations professionnelles :
Activité : Developpeur- Amateur
Secteur : Santé

Informations forums :
Inscription : juin 2010
Messages : 982
Points : 573
Points : 573
Envoyer un message via Skype™ à redoran
Salam ;
Citation:
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...
redoran est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2012, 08h31   #8
Invité de passage
 
Inscription : mai 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 24
Points : 0
Points : 0
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 :
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
illidan05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2012, 09h05   #9
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 728
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 728
Points : 3 295
Points : 3 295
Citation:
à 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.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2012, 17h27   #10
Invité de passage
 
Inscription : mai 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 24
Points : 0
Points : 0
Si ça peut aider quelqu'un on m'a donné la solution à mon problème :

Code :
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.
illidan05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h21.


 
 
 
 
Partenaires

Hébergement Web