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

Contribuez / Téléchargez Sources et Outils PHP Discussion :

Elimination des doublons


Sujet :

Contribuez / Téléchargez Sources et Outils PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut Elimination des doublons
    Bonjour tout le monde.
    Je développe en PHP Mysql une application pour la gestion des présences des employés.
    Les employés pointent avec leurs badges à l'arrivée et à la sortie.
    Ces informations sont transmises ensuite vers un fihier Execl qui regroupe Nom Prénom Date et les heures.
    Des fois par manque d'attention, les employés pointent 2 fois l'arrivée
    ou la sortie avec un intervalle de quelques secondes.
    J'a pu importer les données du fichier Excel sur ma base de données.
    Mais je souhaiterais éliminer les doublons.
    PS :Un doublon c'est quand il s'agit de la même personne mais la différence des heures est inférieure à 15 secondes.

    La structure de ma table est
    Nom Prénom, Date et Heure.

    Donc en Gros, pour chaque Nom je souhaiterais comparer les heures et éliminer ensuite l'heure la plus récente.

    Merci de votre aide

  2. #2
    Membre éprouvé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Novembre 2012
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 378
    Points : 1 038
    Points
    1 038
    Par défaut
    Bonjour,

    Il y a sur le site un tuto sur les fonctions de dates/heures avec MySQL.

    Plutôt que de chercher à supprimer les doublons, il faudrait mieux ne pas en créer en vérifiant juste avant l'insertion qu'il n'existe pas déjà un enregistrement pour le même utilisateur créé dans les 15 dernières secondes.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Merci pour la réponse, le fichier que je reçois et celui de toute la journée.
    Donc il y aura forcément des données en doubles.
    Ce que je souhaiterais déjà c'est seulement pouvoir afficher ces données en double et je les supprimerai manuellement.
    Y'a t'il une requête qui fait ça ?

  4. #4
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Une question.

    Si Pierre Martin pointe à 7:00:00 puis à 7:00:15 puis à 7:00:30 tu dois enregistrer 7:00:00 et 7:00:30 ou bien seulement 7:00:00 car il y a moins de 18 secondes entre le second et le troisième pointage ?
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Je prendrai concideration seulement le premier pointage dans ce cas.
    L'intervalle de temps je peux le changer. C'est la façon avec laquelle je dois coder ça qui me fais planter

  6. #6
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Est-ce que tu aurais un fichier exemple ?
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Pas maintenant mais je reçois un fichier Excel avec
    Id du pointage, porte, date qui regroupe la date du jour+ heure, et nom de la personne regroupant nom et prénom

  8. #8
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    L'idée est de déverser les données du fichier Excel dans une table "temporaire" qui est vidée avant l'insertion.
    Puis de faire l'insertion dans la table définitive à partir de la requête suivante.

    Avec le peu de données que j'ai ça à l'air de fonctionner.

    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
     
    SELECT `nom`,`prenom`,`date`, `heure` FROM
    (
     SELECT T1.`nom`,T1.`prenom`,T1.`date`, T1.`heure`, 
     CASE WHEN T2.`heure` IS NULL THEN T1.`heure` ELSE T2.`heure` END AS `heure2`,
     T1.`heure` - (CASE WHEN T2.`heure` IS NULL THEN T1.`heure` ELSE T2.`heure` END ) AS `delta`
     FROM
     (
     SELECT `nom`,`prenom`,`date`, `heure`, @rank:=@rank+1 as rang
     FROM `horaires_tmp`
     inner join (SELECT @rank:=0) RANK
     ) T1
     LEFT JOIN
     (
     SELECT `nom`,`prenom`,`date`, `heure`, @rank2:=@rank2+1 as rang
     FROM `horaires_tmp`
     inner join (SELECT @rank2:=0) RANK
     ) T2
     ON T1.nom = T2.nom AND T1.prenom = T2.prenom AND T1.`date` = T2.`date` AND T1.`rang` = T2.`rang`+1
    ) AS RESULTAT
    WHERE `delta` NOT BETWEEN 1 AND 18

    Les données : les heures surlignées doivent disparaître du résulat.

    Nom : Capture20181025001.JPG
Affichages : 161
Taille : 31,4 Ko

    donne

    Nom : Capture20181025002.JPG
Affichages : 172
Taille : 21,5 Ko

    Le fichier SQL joint contient la structure de la table et les données.
    Fichiers attachés Fichiers attachés
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  9. #9
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Merci pour ta réponse.
    Je resterai ça demain et je te tiendrai au courant

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Bonjour Badaze,
    Je viens de tester ta requête et en essayant de l'adapter avec ma table ça me sort une erreur.
    Le tableau que je reçois est sous cette forme :
    N° Pointage : 12345
    Date : 25/10/2018 08:00:23
    event : Accès permis
    Door : Pointage
    desc : DUPONT, Pierre

    Le champs date regroupe alors la date et l'heure
    J'importe les champs date et desc sur une base de données et ma table "tbl_excel" devient de cette forme :

    date
    26/10/2018 08:00:15
    description Dupont, Pierre

    J'ai appliqué donc ta requête comme suit :

    Code Sql:

    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
    SELECT `description`,`substr(date, 1, 10)`, `substr(date, 12, 19)` FROM
    (   
     SELECT T1.`description`,T1.`substr(date, 1, 10)`, T1.`substr(date, 12, 19)`, 
     CASE WHEN T2.`substr(date, 12, 19)` IS NULL THEN T1.`substr(date, 12, 19)` ELSE T2.`substr(date, 12, 19)` END AS `heure2`,
     T1.`substr(date, 12, 19)` - (CASE WHEN T2.`substr(date, 12, 19)` IS NULL THEN T1.`substr(date, 12, 19)` ELSE T2.`substr(date, 12, 19)` END ) AS `delta`
     FROM
     (
     SELECT `description`,`substr(date, 1, 10)`, `substr(date, 12, 19)`, @rank:=@rank+1 as rang
     FROM `tbl_excel`
     inner join (SELECT @rank:=0) RANK
     ) T1
     LEFT JOIN
     (
     SELECT `description`,`substr(date, 1, 10)`, `substr(date, 12, 19)`, @rank2:=@rank2+1 as rang
     FROM `tbl_excel`
     inner join (SELECT @rank2:=0) RANK
     ) T2
     ON T1.description = T2.description AND T1.`substr(date, 1, 10)` = T2.`substr(date, 1, 10)` AND T1.`rang` = T2.`rang`+1
    ) AS RESULTAT
    WHERE `delta` NOT BETWEEN 1 AND 18

    L'erreur que j'ai est la suivante :
    Unknown column 'substr(date, 12, 19)' in 'field list'
    Merci encore

  11. #11
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Il ne faut pas mettre de ´ autour de substr(....) mais autour de date.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  12. #12
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Maintenant c'est :
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(substr('date', 12, 19)) END ) AS `delta`
    FROM
    (
    SELECT `description`,substr(' at line 5
    Merci

  13. #13
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    C’est pas le même guillemet autour de date qu’autour des autres champs.
    Je ne vais pas débogguer ta requête.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  14. #14
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Bonjour,

    J'ai fait comme ce que tu m'as dit, j'ai créé une autre table pour extraire les champs Date et heure, et j'ai exécuté ta requête.
    ça a marché. Un grand merci pour ton aide.

  15. #15
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Dans ce cas marque la discussion comme et n’hésite pas les réponses qui t’ont aidées.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  16. #16
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    En fait c'est pas résolu tant que ça.
    Quand j'ai fait le test sur un tableau avec beaucoup de données, ça n'élimine pas du tout les doublons.
    ça me ré-affiche la table d'origine

  17. #17
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Poste le source de la table ainsi que son contenu et la requête bien sûr.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  18. #18
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Je l'enverrai lundi. Merci beaucoup

  19. #19
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 156
    Points : 95
    Points
    95
    Par défaut
    Bonjour,
    Voici ma table.
    La requete est la suivante :

    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
    SELECT `description`,`substr(date, 1, 10)`, `substr(date, 12, 19)` FROM
    (   
     SELECT T1.`description`,T1.`substr(date, 1, 10)`, T1.`substr(date, 12, 19)`, 
     CASE WHEN T2.`substr(date, 12, 19)` IS NULL THEN T1.`substr(date, 12, 19)` ELSE T2.`substr(date, 12, 19)` END AS `heure2`,
     T1.`substr(date, 12, 19)` - (CASE WHEN T2.`substr(date, 12, 19)` IS NULL THEN T1.`substr(date, 12, 19)` ELSE T2.`substr(date, 12, 19)` END ) AS `delta`
     FROM
     (
     SELECT `description`,`substr(date, 1, 10)`, `substr(date, 12, 19)`, @rank:=@rank+1 as rang
     FROM `tbl_excel`
     inner join (SELECT @rank:=0) RANK
     ) T1
     LEFT JOIN
     (
     SELECT `description`,`substr(date, 1, 10)`, `substr(date, 12, 19)`, @rank2:=@rank2+1 as rang
     FROM `tbl_excel`
     inner join (SELECT @rank2:=0) RANK
     ) T2
     ON T1.description = T2.description AND T1.`substr(date, 1, 10)` = T2.`substr(date, 1, 10)` AND T1.`rang` = T2.`rang`+1
    ) AS RESULTAT
    WHERE `delta` NOT BETWEEN 1 AND 18
    Fichiers attachés Fichiers attachés

  20. #20
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Ta requête SQL n'a rien à voir avec ce que j'ai posté....

    tu mets :
    1 - `substr(date, 1, 10)` alors que les ` entourent un champ => substr(date`,1, 10) d'où une erreur indiquant un champ inconnu.
    2 - T1.`substr(date, 1, 10)`alors que l'alias d'une table préfixe le champ => substr(T1.`date`, 1, 10)
    3 - Ta date/heure est mise dans un champ VARCHAR donc impossible de faire des calculs de date dessus sans conversion.

    Là ça n'a pas l'air trop déconnant. A toi de contrôler.

    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
    23
    24
    25
    26
     
    SELECT `description`, `datex`, `heure`,`heure2`, `delta` FROM
    (   
     SELECT T1.`description`, T1.`datex`, T1.`heure`, 
     CASE WHEN T2.`datex` IS NULL THEN T1.`heure` ELSE T2.`heure` END AS `heure2`,
     TIME_TO_SEC(T1.`heure`) - (CASE WHEN T2.`heure` IS NULL THEN TIME_TO_SEC(T1.`heure`) ELSE TIME_TO_SEC(T2.`heure`) END ) AS `delta`
     FROM
     (
     SELECT `description`,date(STR_TO_DATE(substr(`date`, 1, 10),'%d/%m/%Y')) as `datex`, 
     (substr(`date`, 12, 8)) as `heure`, @rank:=@rank+1 as rang
     FROM `tbl_excel`
     inner join (SELECT @rank:=0) RANK
     order by 1, 2, 3
     ) T1
     LEFT JOIN
     (
     SELECT `description`,date(STR_TO_DATE(substr(`date`, 1, 10),'%d/%m/%Y')) as `datex`, 
     (substr(`date`, 12, 8)) as `heure`, @rank2:=@rank2+1 as rang
     FROM `tbl_excel`
     inner join (SELECT @rank2:=0) RANK
     order by 1, 2, 3
     ) T2
     ON T1.description = T2.description AND T1.`datex` = T2.`datex` AND T1.`rang` = T2.`rang`+1
    ) AS RESULTAT
    WHERE `delta` NOT BETWEEN 1 AND 18
    order by `description`, `datex`, `heure`
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Eliminer des doublons dans un fichier
    Par fennec62 dans le forum Général Python
    Réponses: 13
    Dernier message: 11/01/2009, 11h40
  2. Réponses: 8
    Dernier message: 22/03/2006, 17h16
  3. Elimination des doublons
    Par amika dans le forum Requêtes
    Réponses: 8
    Dernier message: 05/11/2005, 09h28
  4. Elimination des doublons
    Par bilalove dans le forum Oracle
    Réponses: 3
    Dernier message: 11/08/2005, 13h53
  5. Eliminer des Doublon dans une Table
    Par Soulama dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/02/2005, 14h27

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