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 averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    49
    D�tails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 49
    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 averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    49
    D�tails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 49
    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 confirm�
    Homme Profil pro
    Responsable Donn�es
    Inscrit en
    Janvier 2009
    Messages
    5 442
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Responsable Donn�es

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 442
    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 averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    49
    D�tails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 49
    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