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

HyperFileSQL Discussion :

Isoler des données ayant des valeurs communes [HF23]


Sujet :

HyperFileSQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut Isoler des données ayant des valeurs communes
    Bonjour ,
    je trie les photos éparpillées sur mon disque dur , et les ai rassemblées en une table contenant entre autres une rubrique 'données EXIF brutes ' et une rubrique 'Taille du fichier'.
    Les autres données sont le chemin sur le disque et la date de modification
    Je pars du principe que deux clichés partageant la même chaine exif et la même taille sont des doublons .
    Je souhaite à l'arrivée obtenir dans une table ou une requête une liste ordonnée des clichés probablement doublonnés . Cette liste doit aussi contenir les autres rubriques ( le chemin sur le disque par exemple )
    Je suis parvenu à isoler l'aide de ces instruction
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	SELECT 
    	CONCAT(Collectiondephotos.PhotoTaille,'_',Collectiondephotos.PhotoExif) AS valeur, 
    	COUNT(*) AS nombre_de_repetition
    	FROM Collectiondephotos
    	WHERE Collectiondephotos.PhotoExif <>''
    	GROUP BY valeur
    	HAVING nombre_de_repetition > 1
    à extraire les valeurs qui sont doublonnées en taille + donnée exif , mais elles seules , je ne peux pas extraire ou je n'ai pas trouvé de syntaxe pour sortir soit les chemins soit les id des lignes concernées .
    je passe donc par une laborieuse boucle en windev qui lit les lignes , recherche ces valeurs dans la table d'origine et recopie ces données dans une autre table
    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
    	POUR TOUT REQ														// traitement de chaque enregistrement renvoyé par la requete.
    		sResult=HRécupèreEnregistrement(REQ) 
    		sTaille = ExtraitChaîne (sResult,1,["_",TAB],DepuisDébut)
    		sExif = ExtraitChaîne (sResult,2,["_",TAB],DepuisDébut)
    		nlignes=ExtraitChaîne (sResult,3,["_",TAB],DepuisDébut)
    sResult = [
    	INSERT INTO Collectiondedoublons
    	SELECT * FROM Collectiondephotos
    	WHERE 
    	collectiondephotos.PhotoTaille = '%1'
    	AND
    	collectiondephotos.PhotoExif = '%2';
    	]
    	sResult = ChaîneConstruit(sResult,sTaille,sExif)
    	bB = HExécuteRequêteSQL(REQ2,hRequêteDéfaut,sResult)

    C'est malheureusement assez lent ....:-/
    ET d'autre part cette procédure ne regroupe pas les clichés par groupes de doublons donc ne me convient pas tout à fait ( le but final est de les défiler ensuite séquentiellement dans une fenêtre de visualisation )
    j'aurais aimé rester dans le SQL , peut être aussi pour la beauté du geste .
    Je ne parviens pas à trouver de solution , d'où mon appel au secours en espérant que vous saurez m'orienter ou me fournir une solution :-)
    D'avance merci pour les conseils qui pourraient m'être prodigués
    TC

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut Je me réponds à moi même :-)
    J'aurai aimé trouver une solution plus élégante ne faisant pas appel à des tables intermédiaires mais c'est déjà une avancée.
    J'utilise deux tables intermédiaires, l'une recevant la liste des clé de reconnaissance des doublons ( la concaténation de la taille et de la chaine exif des photos ) la suivante permettant de défaire cette concaténation et servant de filtre pour réaliser une requête contenant les coordonnées des clichés doublonnés .
    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
    REQ_DB est une Requête SQL = [
    	DELETE FROM Relais;
    	DELETE FROM Relais2;
    	INSERT INTO
    	Relais
    	(CleComp,Iter)
    	SELECT 
    	CONCAT(Collectiondephotos.PhotoTaille,'_',Collectiondephotos.PhotoExif) AS valeur, 
    	COUNT(*) AS nombre_de_repetition
    	FROM Collectiondephotos
    	WHERE Collectiondephotos.PhotoExif <>''
    	GROUP BY valeur
    	HAVING nombre_de_repetition > 1;
    	INSERT INTO
    	Relais2	
    	(IDExif,PTaille)
    	SELECT
    	SUBSTR (CleComp,INSTR(CleComp,'_')+1),
    	SUBSTR (CleComp,1,INSTR(CleComp,'_')-1)
    	FROM Relais;
    	SELECT
    	IDCollectiondephotos,Fichier,Chemin,Nom,PhotoTaille,PhotoExif,PhotoDateModif
    	FROM 
    	(Collectiondephotos LEFT JOIN Relais2 ON Collectiondephotos.PhotoExif = Relais2.IDExif AND Collectiondephotos.PhotoTaille = Relais2.PTaille)
    	ORDER BY PhotoTaille , PhotoExif, Nom;
    ]
    Voilà , il ne reste plus qu'à exploiter les lignes de REQ_DB
    Vous poser la question m'a permis de remettre de l'ordre dans mes réflexions :-)
    Bonne soirée à vous tous
    TC

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    4 880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 880
    Points : 11 815
    Points
    11 815
    Par défaut
    Bonjour,
    Tu peux utiliser une jointure pour avoir toutes les lignes concernées, par exemple:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select distinct t1.*
    from LaTable as t1
    inner join LaTable as t2
    on t1.col1 = t2.col1 and t1.col2 = t2.col2
    where t1.id < t2.id
    Tu auras ainsi toutes les lignes de la table LaTable pour lesquelles il en existe d'autres avec des données identiques dans col1 et col2.
    Tu peux aussi utiliser une sous-requête avec un Exists:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select *
    from LaTable as t1
    where exists(select 1 from LaTable as t2 where t1.col1 = t2.col1 and t1.col2 = t2.col2 and t1.id <> t2.id)

    Honnêtement je ne sais pas quelle syntaxe sera la plus rapide, il ne reste plus qu'à tester.

    Tatayo.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    avril 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : avril 2011
    Messages : 31
    Points : 22
    Points
    22
    Par défaut Chapeau bas !
    Bonjour ,
    Sur un échantillon de 200 photos différentes , + 10 recopiées dans un sous répertoire et 5 dans un autre ( donc 215 photos , 5 en triple exemplaire et 5 en double )
    Tes deux solutions se valent en terme de performance ( 11 millisecondes l'exécution de la requête ) et je préfère passer les performances de la mienne sous silence ...
    La première ne liste qu'une fois les photos qui existent en plusieurs exemplaires et semble avoir un effet de bord , la première photo est considérée comme doublonnée.
    La deuxième avec la sous requête liste tous les exemplaires des photos dupliquées et je ne lui ai pas repéré de défaut .
    Un immense bravo et merci !
    Bonne soirée TC

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/01/2016, 10h08
  2. Isoler des valeurs sur un graphe
    Par nuguem dans le forum ODS et reporting
    Réponses: 14
    Dernier message: 13/01/2012, 16h27
  3. Réponses: 4
    Dernier message: 29/08/2007, 16h01
  4. Réponses: 1
    Dernier message: 13/03/2007, 09h52
  5. [CSS] regrouper des valeurs communes
    Par nixonne dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 28/08/2005, 03h49

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