Problème de suppression de doublons en PHP/SQL

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème de suppression de doublons en PHP/SQL

Re: Problème de suppression de doublons en PHP/SQL

par illidan05 » 14 janv. 2012, 18:28

Si ça peut aider quelqu'un on m'a donné la solution à mon problème :
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.

Re: Problème de suppression de doublons en PHP/SQL

par illidan05 » 14 janv. 2012, 09:30

Salut,

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 : Tout sélectionner

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

Re: Problème de suppression de doublons en PHP/SQL

par moogli » 13 janv. 2012, 13:37

Le problème c'est d'être certain de n'avoir que le dernier Tupperware concerné, on pourrait aussi utiliser une sous requete dans le where pour sélectionner les bonnes date justement à partir de ta requête (sans le sélect *).

Et la y a tous ce que tu veux
Par exemple
select truc, machin from tables where DateIntervention in (select max(DateIntervention) from historiques group by typeintervention) ordre by DAteIntervention desc;

@+

Re: Problème de suppression de doublons en PHP/SQL

par Shenryu » 13 janv. 2012, 12:55

Ça marche pas un truc comme ça ?
SELECT *, MAX(DateIntervention) as dateMax FROM Historique GROUP BY TypeIntervention ORDER BY dateMax DESC

Re: Problème de suppression de doublons en PHP/SQL

par illidan05 » 13 janv. 2012, 12:49

Salut,

Si je fais un GROUP BY TypeIntervention le problème c'est qu'il prendra en compte l'ordre dans lequel les interventions sont enregistrés (par numéro d'id).
Or je veux faire un tri décroissant des dates avant de réaliser cette opération pour être sur qu'à chaque fois ça me sorte la dernière révision ou vérification.
Car cette base évoluera dans le temps avec l'ajout régulier de nouvelles interventions et il faudra donc à chaque requête réorganiser les dates.

Dans l'exemple ci-dessus, si je fais un group by sans tri des dates, ce sera la première ligne rencontrée qui servira de référence pour supprimer les doublons.

merci

Re: Problème de suppression de doublons en PHP/SQL

par Shenryu » 13 janv. 2012, 12:24

Salut,

Essaie avec un group by TypeIntervention ;)

Re: Problème de suppression de doublons en PHP/SQL

par illidan05 » 13 janv. 2012, 12:17

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

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

Code : Tout sélectionner

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 : Tout sélectionner

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

Re: Problème de suppression de doublons en PHP/SQL

par illidan05 » 12 janv. 2012, 21:44

Merci pour ta réponse,

Je débute donc c'est fort possible que le code soit loin d'être optimisé ^^.

Si tu as le temps, peux-tu me donner un exemple basé sur les bouts de codes que j'ai mis plus haut stp ?
Sinon tu me conseille de séparer les données dans plusieurs tables alors ? Pour info ce site ne sert qu'en local et n'a pas pour but d'être mis sur internet.

merci encore

Re: Problème de suppression de doublons en PHP/SQL

par moogli » 12 janv. 2012, 21:32

Salut,

Comme ça rapidement je te dirais de regarder la class havint de sql ou alors en php c'est assez simple, surtout si tu utilise pdo.
1/ requête
2/ pdo:: fetchAll()
3/ foreach sur le tableau fournis au deux et tu remplis un tableau final, pour supprimer les doublons dans la boucle tu vérifie s'il existe déjà un index avec la même donnée si oui tu fait rien si non tu insère dans le tableau (bon la vérification ce fera soit avec une autre boucle sur le second tableau soit ene utilisant un troisième tableau qui stoker la Vaneau déjà utilisé (juste la valeur tout le reste, ce qui fait que tu utilise in_array sur le tableau qui contient que la valeur et inséré dans celui qui contient les données ;) ).
4/ tu exploite le tableau de données

En dehors de ça je pense que ta table est mal construite 39 champs dans une table c'est juste énorme ;)
Y a sûrement moyen de scinder en plusieurs table ?
Rien que les index doivent pouvoir être dans une autre table.

Côté sql dans ce que tu montre le key et l'unique sont inutile car le primary key le fait déjà déjà ;)

@+

Problème de suppression de doublons en PHP/SQL

par illidan05 » 12 janv. 2012, 20:47

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 :
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 :
$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