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