FIND_IN_SET est une fonction de chaîne dans MySQL utilisée pour trouver la position d’une chaîne dans une liste de chaînes séparées par des virgules. Il retourne un nombre entier indiquant la position de la chaîne trouvée (comptée à partir de 1) ou 0 si la chaîne n’est pas dans la liste. Cette fonction est souvent utilisée pour traiter les champs qui sont stockés comme des chaînes séparées par des virgules, bien que cette conception ne soit généralement pas recommandée (il est préférable d’utiliser les avantages d’une base de données relationnelle, comme la création de tables relationnelles beaucoup à beaucoup).
La grammaire
FIND_IN_SET(str, strlist)
STR: chaîne à rechercher.
Strlist: liste contenant plusieurs chaînes séparées par des virgules.
exemples
Supposons qu’il y ait une table nommée utilisateur contenant une colonne de hobbies qui stocke les hobbies de l’utilisateur, séparés par des virgules.
SELECT * FROM users WHERE FIND_IN_SET('eat', hobbies) > 0;
Notes et précautions
Performance: l’utilisation de FIND_IN_SET peut causer des problèmes de performance sur de grands ensembles de données, car elle nécessite une analyse ligne par ligne et l’analyse de chaînes séparées par des virgules.
Index: FIND_IN_SET ne peut pas être utilisé sur un index, ce qui signifie que les requêtes peuvent ne pas être en mesure d’utiliser un index pour accélérer la récupération des données.
Normalisation des données: il est préférable de normaliser ce champ multi-valeur, par exemple en créant une nouvelle table user_hobbies avec les champs user_id et hobby, chaque hobby de chaque utilisateur occupant une ligne. Cela permet d’utiliser les opérations d’union SQL standard et d’utiliser l’indexation pour améliorer les performances des requêtes.
En général, bien que FIND_IN_SET puisse être utile dans certains cas, il est préférable d’éviter d’utiliser des chaînes séparées par des virgules pour stocker plusieurs valeurs lors de la conception de votre base de données et d’adopter plutôt une approche plus normative.