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 :

Problème de suppression de doublons en PHP/SQL


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 55
    Par défaut Problème de suppression de doublons en PHP/SQL
    Bonsoir à tous,

    J'aurais besoin de votre aide pour réaliser un filtre de doublon, je sais qu'il y a une fonction array_unique mais je ne sais pas comment l'utiliser dans mon cas.
    Je souhaitais le faire en SQL avec GROUP BY et HAVING mais avant de filtrer le doublon je dois faire un ORDER BY Date et on n'a pas su m'aider sur les forums.

    Voici ma table :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    CREATE TABLE Historique ( 
    id int(11) NOT NULL auto_increment, 
    Loc varchar(255), 
    Loc1 varchar(255), 
    Ensemble varchar(255), 
    RepUnifilaire varchar(255), 
    Typemat varchar(255), 
    Typeorg varchar(255), 
    TensionUtil varchar(255), 
    IndicePhase varchar(255), 
    DateIntervention DATE, 
    TypeIntervention varchar(255), 
    SousEnsemble varchar(255), 
    IndexCompteurOrganePh1 varchar(255), 
    IndexCompteurOrganePh2 varchar(255), 
    IndexCompteurOrganePh3 varchar(255), 
    IndexCompteurCommandePh1 varchar(255), 
    IndexCompteurCommandePh2 varchar(255), 
    IndexCompteurCommandePh3 varchar(255), 
    IndexCompteurUniqueOrgane varchar(255), 
    IndexCompteurUniqueCommande varchar(255), 
    Prestataire varchar(255), 
    NumCR varchar(255), 
    ObjetTravaux varchar(255), 
    Observation longtext, 
    Anomalie longtext, 
    AnomalieNonRep longtext, 
    Concatener varchar(255), 
    PRIMARY KEY (id), 
    KEY id (id), 
    UNIQUE id_2 (id) );
    Et voici ma requête en PHP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $sql = "SELECT * FROM Historique ORDER BY DateIntervention DESC";
     
    mysql_query("SET NAMES utf8" );
     
    $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); 
     
    $nb_resultats = mysql_num_rows($req);
     
    if($nb_resultats != 0)
    {
             while($data = mysql_fetch_array($req)) 
             {	
    //......
    Après ça j'ai mon script PHP qui m'affiche mes lignes de données sous forme de tableau.

    Dans ma colonne nommée "Concatener" j'ai des doublons et je souhaiterais ne garder que la première occurence de chaque doublons et ainsi supprimer les lignes contenants ces doublons. Je ne peux le faire en SQL car je veux faire un tri décroissant des dates avant de gérer ces doublons.

    Merci pour votre aide

  2. #2
    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
    Bonsoir,

    en MySQL il est possible de faire ce que tu souhaites en une seule passe tout en conservant des bonnes performances, j'ai pas essayé avec PHP :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    set @num := 0, @concatener := '';
    SELECT *, 
       @num := if(@Concatener = concatener, @num + 1, 1) AS row_num,
       @concatener := Concatener AS tmp_fld
    FROM Historique
    GROUP BY Concatener DESC
    HAVING row_num < 2;
    Yapuka tester en croisant les doigts

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 55
    Par défaut
    Merci pour ta réponse,

    le seul soucis c'est que tu fais le tri décroissant sur la colonne "Concatener" or il faut que ce tri se fasse sur la colonne "DateIntervention" avant de regrouper et supprimer les doublons de la colonne "Concatener".

    Sais-tu comment faire ?

    Merci encore

  4. #4
    Membre expérimenté
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT h1.*
    FROM Historique h1
    WHERE h1.DateIntervention = (
         SELECT MAX(h2.DateIntervention)
         FROM Historique h2
         WHERE h2.Concatener = h1.Concatener
    )
    ORDER BY h1.DateIntervention DESC
    C'est pas hyper propre ... et je te conseille de regarder pour indexer les champs qui vont bien pour optimiser cette requête.

  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
    Citation Envoyé par illidan05 Voir le message
    Dans ma colonne nommée "Concatener" j'ai des doublons et je souhaiterais ne garder que la première occurence de chaque doublons et ainsi supprimer les lignes contenants ces doublons.
    Et dans ce cas de figure tu choisis comment les bons enregistrements :
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DateIntervention | Concatener | Prestataire
       2012-01-13    |     a      |      x
       2012-01-13    |     a      |      y
       2012-01-12    |     b      |      z
       2012-01-12    |     a      |      w
       2012-01-12    |     a      |      y
    Pourrais tu poster le résultat escompté.

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 55
    Par défaut
    Merci pour vos réponses,

    ci-dessous un exemple concret de ce que je cherche à obtenir comme résultat.

    Les données actuellement dans la table "Historique" :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Loc	|	     Ensemble	        | RepUnifilaire	|     Typeorg	|   DateIntervention	|   TypeIntervention	|	         Concatener
     
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	1988-12-26	|	Révision	|	A1UTransformateur TR126910FX14
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	1988-12-27	|	Révision	|	A1UTransformateur TR126910FX14
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	1988-12-28	|	Réépreuve	|	A1UTransformateur TR126910FX14
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	1992-01-08	|	Correctif	|	A1UTransformateur TR126910FX14
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	1995-11-08	|	Vérification	|	A1UTransformateur TR126910FX14
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	2000-12-04	|	Réépreuve	|	A1UTransformateur TR126910FX14
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	2003-01-15	|	Vérification	|	A1UTransformateur TR126910FX14
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	2003-03-25	|	Vérification	|	A1UTransformateur TR126910FX14
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	2006-12-01	|	Vérification	|	A1UTransformateur TR126910FX14
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	2007-03-27	|	Correctif	|	A1UTransformateur TR126910FX14
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	2007-11-19	|	Correctif	|	A1UTransformateur TR126910FX14
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	2010-02-03	|	Vérification	|	A1UTransformateur TR126910FX14
     
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	1990-02-26	|	Réépreuve	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	1990-02-27	|	Révision	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	1990-02-28	|	Révision	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	1998-07-22	|	Correctif	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	1998-11-10	|	Correctif	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	2001-10-10	|	Vérification	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	2003-01-06	|	Vérification	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	2003-06-19	|	Réépreuve	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	2004-02-02	|	Révision	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	2004-02-03	|	Vérification	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	2005-11-25	|	Correctif	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	2006-01-04	|	Correctif	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	2007-01-10	|	Vérification	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	2010-02-15	|	Vérification	|	A2UTransformateur TR13910PFA1
     
    B1U	|	Transformateur TR1	|	6910	|	FXT245	|	2001-12-19	|	Vérification	|	B1UTransformateur TR16910FXT245
    B1U	|	Transformateur TR1	|	6910	|	FXT245	|	2001-12-20	|	Révision	|	B1UTransformateur TR16910FXT245
    B1U	|	Transformateur TR1	|	6910	|	FXT245	|	2001-12-21	|	Vérification	|	B1UTransformateur TR16910FXT245
    B1U	|	Transformateur TR1	|	6910	|	FXT245	|	2002-09-10	|	Vérification	|	B1UTransformateur TR16910FXT245
    B1U	|	Transformateur TR1	|	6910	|	FXT245	|	2003-02-03	|	Vérification	|	B1UTransformateur TR16910FXT245
    B1U	|	Transformateur TR1	|	6910	|	FXT245	|	2007-03-20	|	Vérification	|	B1UTransformateur TR16910FXT245
    B1U	|	Transformateur TR1	|	6910	|	FXT245	|	2010-10-13	|	Révision	|	B1UTransformateur TR16910FXT245
    B1U	|	Transformateur TR1	|	6910	|	FXT245	|	2010-10-14	|	Vérification	|	B1UTransformateur TR16910FXT245
    Les données que je souhaiterais en sortie de ma requête SQL/PHP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Loc	|	     Ensemble	        | RepUnifilaire	|     Typeorg	|   DateIntervention	|   TypeIntervention	|	         Concatener
     
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	2007-11-19	|	Correctif	|	A1UTransformateur TR126910FX14
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	2000-12-04	|	Réépreuve	|	A1UTransformateur TR126910FX14
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	1988-12-27	|	Révision	|	A1UTransformateur TR126910FX14
    A1U	|	Transformateur TR12	|	6910	|	FX14	|	2010-02-03	|	Vérification	|	A1UTransformateur TR126910FX14
     
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	2006-01-04	|	Correctif	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	2003-06-19	|	Réépreuve	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	2004-02-02	|	Révision	|	A2UTransformateur TR13910PFA1
    A2U	|	Transformateur TR1	|	3910	|	PFA1	|	2010-02-15	|	Vérification	|	A2UTransformateur TR13910PFA1
     
    B1U	|	Transformateur TR1	|	6910	|	FXT245	|	2010-10-13	|	Révision	|	B1UTransformateur TR16910FXT245
    B1U	|	Transformateur TR1	|	6910	|	FXT245	|	2010-10-14	|	Vérification	|	B1UTransformateur TR16910FXT245
    Voilà, encore merci pour votre aide

  7. #7
    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
    Voici ce que je te propose :
    Code sql : 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
    SELECT 
       h1.*
    FROM 
       Historique h1
          INNER JOIN (
             SELECT 
                Historique.`Concatener`, 
                Historique.`TypeIntervention`, 
                MAX(Historique.DateIntervention)
             FROM 
                Historique
             GROUP BY 
                Historique.`Concatener`, 
                Historique.`TypeIntervention`
          ) AS h2 ON h1.`Concatener` = h2.Concatener 
                     AND h1.`TypeIntervention` = h2.`TypeIntervention`
    GROUP BY
       h1.`Concatener`, 
       h1.`TypeIntervention`
    ORDER BY
       h1.`Concatener`,
       h1.`DateIntervention` DESC
    Pas testé, donc croisons les doigts

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 55
    Par défaut
    Merci pour ton aide,

    J'ai testé, ça doit pas être loin du code qui permettrait de faire ce que je cherche car ça me sort un résultat mais tout ce qui devrait être affiché ne l'est pas.

    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 expérimenté
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Par défaut
    Citation Envoyé par illidan05 Voir le message
    J'ai testé, ça doit pas être loin du code qui permettrait de faire ce que je cherche car ça me sort un résultat mais tout ce qui devrait être affiché ne l'est pas.
    T'as essayé la requête que je t'ai donnée ?

  10. #10
    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
    Citation Envoyé par illidan05 Voir le message
    ça me sort un résultat mais tout ce qui devrait être affiché ne l'est pas.
    Ah bon ? J'ai fait un test en local et je retrouve exactement ce que tu souhaites avoir en sortie. Si j'ai bien compris le résultat souhaité est d'avoir la dernière date d'intervention par type d'intervention et par appareil avec un tri décroissant sur la date. Tu noteras que l'on est loin de la requête du prermier post.
    Avec une partie de tes données d'entrée, voici ce que j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DateIntervention                Concatener                  TypeIntervention
       1995-11-08             A1UTransformateur TR126910FX14     Vérification
       1992-01-08             A1UTransformateur TR126910FX14     Correctif
       1988-12-28             A1UTransformateur TR126910FX14     Réépreuve
       1988-12-26             A1UTransformateur TR126910FX14     Révision
       1995-11-08             TR126910FX14                       Vérification
       1992-01-08             TR126910FX14                       Correctif
       1988-12-28             TR126910FX14                       Réépreuve
       1988-12-26             TR126910FX14                       Révision

Discussions similaires

  1. suppression des doublons dans un SQL récursif
    Par dr_nilkog dans le forum DB2
    Réponses: 10
    Dernier message: 10/10/2011, 09h24
  2. Réponses: 3
    Dernier message: 26/07/2009, 10h06
  3. [SQL] problème : PHP & SQL > < Javascript
    Par Sophie2097 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 26/10/2006, 20h12
  4. Problème de sessions PHP/SQL
    Par Mousk dans le forum Langage
    Réponses: 6
    Dernier message: 11/08/2006, 15h02
  5. [SQL-Server] Problème avec la fonction mssql_connect (connexion PHP SQL Server)
    Par flydragon dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/05/2006, 11h59

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