2017-05-10 1 views
0

Je prends la classe MySQL de Duke sur Coursera. Au cours de la deuxième semaine, on parle de données désordonnées et je me suis dit que je poserais ma question ici. La portée de ma question serait comment comparer une entrée dans une rangée de table qui correspondrait déjà à une instance sauf qu'elle a été entrée avec un tiret, par exemple "Golden Retriever Mix" est la même instance que "Golden Retriever-Mix". Et quand je lance une instruction DISTINCT SELECT, je ne veux pas qu'elle tire les deux résultats. Le hic, c'est que nous ne pouvons pas simplement enlever tous les traits d'union des champs de colonnes parce que nous les voulons toujours par exemple pour l'entrée de "Golden Retriever-Airedale Terrier Mix". Comment une requête chercherait-elle à le faire? L'exemple de code qui tire à la fois "Golden Retriever Mix" et "Golden Retriever-Mix" est ci-dessous.Requête MySQL pour supprimer les doublons avec trait d'union

SELECT DISTINCT breed, 
TRIM(LEADING '-' FROM breed) 
FROM dogs 
ORDER BY (LEADING '-' FROM breed) LIMIT 1000, 1000; 

Je pense que je dois et IF/THEN qui dit IF(REPLACE(breed,'-','') = breed) THEN DELETE breed;

Il est évident que ce n'est pas une syntaxe correcte qui est ce que je cherche.

+0

Où vous en avez plusieurs qui sont identiques (après avoir remplacé les traits d'union) - cela vous dérange-t-il quelle variante vous gardez? – Bridge

Répondre

0

Vous y êtes presque, dans votre article select tout ce que vous devez faire est de se débarrasser de la colonne breed simple et changer TRIM() avec REPLACE()

SELECT DISTINCT REPLACE(breed, '-', ' ') 
FROM dogs 

TRIM(LEADING...) supprimerait les traits d'union au début de la chaîne , mais ce que vous voulez montrer est les valeurs distinctes de breed en considérant les traits d'union comme des espaces.

Modifier

je présume que les deux chaînes étaient "Golden Retriever Mix" et "Golden Retriever-Mix", mais s'il y a en fait un espace après le trait d'union ("Golden Retriever- Mix"), vous peut utiliser à la place REPLACE(breed, '-', '')

Edit 2

Après la clarification de votre commentaire, je pense que ce dont vous avez besoin est une clause GROUP BY

SELECT MIN(breed) 
FROM dogs 
GROUP BY REPLACE(breed, '-', ' ') 

Toute chaîne avec un hypen sera considérée comme étant de valeur supérieure à la même chaîne avec un espace à la place, donc quand il y a deux cette requête retournera celle avec l'espace. S'il n'y en a qu'une, elle sera retournée telle quelle

+0

À droite, cela affichera le nom du champ mais sans les traits d'union quand je veux toujours qu'il sorte les traits d'union. Je veux seulement enlever des rangées qui égaleraient une autre rangée sans trait d'union. –

+0

@BrianWiley Noté, j'ai amélioré ma réponse –

0

Je pense que ce que vous cherchez est la distance de Levenshtein (https://en.wikipedia.org/wiki/Levenshtein_distance). Celui-ci calcule la différence entre les mots, par ex. la comparaison de "Test" et "Test1" aboutirait à 1 parce qu'il y a une lettre de plus. Vous pouvez utiliser les procédures proposées de How to add levenshtein function in mysql? ou Levenshtein: MySQL + PHP

Cela permettra non seulement afficher toutes les entrées ayant un chef de file « - » il inclut même ceux avec fautes d'orthographe. Vous pouvez filtrer vos données de résultat par la distance calculée puis.

Si vous ne voulez pas celui-ci en raison de problèmes de performances, vous pouvez toujours utiliser TRIM ou REPLACE pour filtrer votre symbole et le comparer avec l'autre chaîne.