Match de valeurs séparées par une virgule dans la colonne
Si j'ai une colonne appelée "Catégories" avec dire science,maths,english
dans la ligne séparées par des virgules, comme le montre, comment pourrais-je correspondre à toutes les lignes avec la catégorie contenant maths
?
J'ai essayé un simple LIKE
mais il n'est pas tout à fait exact, car il peut être "poo_science", qui lors de la recherche pour '%science%'
correspondent à la fois.
J'ai regardé autour de StackOverflow et il y a beaucoup de questions similaires, mais tous semblent vouloir renvoyer des données comme une liste séparée par des virgules ou quelque chose - pas tout à fait ce que je suis après.
Je préfère ne pas utiliser une procédure stockée et ne peut pas utiliser la recherche de texte intégral. J'ai une procédure stockée j'ai utilisé qui a ajouté un autre personnage ('$')
autour de chaque valeur, puis recherche pour '$value$'...
est-ce trop méchant? Je suis après un peu plus de méthode simple.
- C'est pourquoi les attributs à plusieurs valeurs sont mal.
- Je pensais que l'augmentation des problèmes de simultanéité est pourquoi ils sont mal.
- Il n'est pas question que je laisse cette conception de stand. Vous avez besoin d'une table d'enfant pour les données de sorte que vous pouvez effectivement qwuery il. Ne jamais stocker une virgule delimeted liste.
- Ils sont mauvais parce que vous avez alors de diviser la chaîne en utilisant une fonction par ligne, puis de recherche de chacun de ces ou de match sur des modèles exacts qui tombe parfois en dehors de caractères spéciaux. C'est cher, on ne pas obtenir les avantages de l'indexation, pas de normalisation, et c'est, bien, ******* ennuyeux. Désolé, les personnages dans les étoiles ne sont pas un juron, par accident, j'ai collé mon mot de passe en 😉
- Pourquoi sur terre serait vous "préférez ne pas utiliser une procédure stockée"? Merci de lire stackoverflow.com/questions/22907/... et stackoverflow.com/questions/2734007/... pour le pré-existantes débats.
- Pouvez-vous élaborer sur la façon
LIKE
clauses sont vulnérables à une Injection SQL? Tout ce que je peux l'imagerie est quelqu'un d'entrer dans un%
à cause d'une analyse de table... - Fredrickson et Beurk - Merci à vous deux. Vous avez raison. Je cherchais à tort et à travers. Commentaires retirée, et merci de m'avoir fait penser!!!! Je pensais à ceci: gremwell.com/sql_injection_in_like_clause où il est facile de se tromper.
Vous devez vous connecter pour publier un commentaire.
Avertissement: Les commentateurs sont à droite... CSVs dans un seul champ sont un horrible conception, et doit être refaite.
Avec cela dit, voici comment vous pouvez travailler autour de votre problème:
Pad
Categories
avec attaque et de fuite,
, de cette façon, vous pouvez les inclure dans votre recherche de génériques:Utilisation FIND_IN_SET(,)
SQL:
ou
pouvez le vérifier sur ce lien FIND_IN_SET() vs EN()
Cette question est visible sur google et a de nombreux points de vue, donc, je veux partager mon approche à ce problème. J'ai eu à traiter avec une telle mauvaise conception que les valeurs séparées par des virgules stockés sous forme de chaînes de trop. Je suis tombé sur cette question tout en peaufinant un CMS plugin du responsable de balises.
Ouais, tags liés à un article du site ont été stockés comme ceci: "tag1,tag2,...,tagN". Afin d'obtenir la correspondance exacte n'était pas aussi trivial qu'il aurait apparu d'abord: à l'aide de simples
LIKE
, avec les articles taggés "balle" j'ai aussi eu ceux marqués "piedballe" et "ballechambre". Pas de critique, mais plutôt ennuyeux.FIND_IN_SET la fonction semblait génial au début, mais ensuite il s'est avéré qu'il n'utilise pas l'index et ne fonctionne pas correctement si le premier argument contient une virgule.
Je n'avais aucune envie de modifier le plugin lui-même ou au plus profond de la CMS à la fonctionnalité de base qui ce plugin a été construit sur.
Il est également intéressant de noter que nécessaire tag (substring) peut être le premier, le dernier élément de la chaîne ou peut-être quelque part au milieu, de sorte que ce morceau de code
WHERE (',' + Categories + ',') LIKE '%,science,%'
ne couvre pas toutes les trois cas.Enfin, j'ai fini avec une solution très simple. Il a travaillé pour moi comme ceci:
... WHERE tags LIKE 'ball,%' OR tags LIKE '%,ball,%' OR tags LIKE '%,ball'
Tous theree cas visés; les virgules sont utilisés comme délimiteurs. Espérons que cela aide d'autres personnes venues de partout semblable piège.
PS. Je ne suis pas un MySQL/DB expert en tout et j'aimerais lire sur les inconvénients potentiels de cette approche, en particulier sur vraiment énorme tables (ce qui n'est pas mon cas, d'ailleurs). Je partage avec vous le résultat de mes petites recherches et ce que j'ai fait pour résoudre ce problème avec un minimum d'efforts.
J'ai fait quelques hypothèses à propos de votre mise en page de données. Essayez ce - à l'aide de SQL Server 2K8+ cela devrait fonctionner:
Il est certainement ne va pas être super efficace ou très évolutif, mais qui travaillait alors à l'encontre de dénormalisée de données tend à inhérente à ces questions.
Je propose un 4x OÙ qui peut correspondre à l'un quelconque des cas possibles: en soi, la valeur au début, au milieu ou à la fin du csv:
De cette façon, tous de la "science" des lignes doit être sélectionné, mais aucun de la 'poo_science" rangées.
utilisation FIND_IN_SET() de mysql fonction
Syntaxe
SÉLECTIONNEZ * à PARTIR d'une OÙ FIND_IN_SET(valeur à rechercher dans la chaîne,chaîne séparée par des virgules);
Exemple
SÉLECTIONNEZ * à PARTIR d'une OÙ FIND_IN_SET(5,"1,2,3,4,5,6");
Plus D'Informations, Suivre Lien Ci-Dessous :
http://blog.sqlauthority.com/2014/03/21/mysql-search-for-values-within-a-comma-separated-values-find_in_set/