Maison >base de données >tutoriel mysql >Comment puis-je rechercher efficacement plusieurs chaînes dans un champ MySQL séparé par des virgules ?

Comment puis-je rechercher efficacement plusieurs chaînes dans un champ MySQL séparé par des virgules ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-11 19:31:43827parcourir

How Can I Efficiently Search for Multiple Strings in a Comma-Separated MySQL Field?

MySQL : une approche plus efficace du find_in_set multi-chaînes

La fonction find_in_set de MySQL est limitée aux recherches de chaîne unique dans des valeurs séparées par des virgules. Cela présente un défi lorsqu'il faut localiser simultanément des enregistrements correspondant à plusieurs chaînes de recherche.

Le défi :

L'objectif est d'identifier les enregistrements dans lesquels un champ contenant des valeurs séparées par des virgules inclut toutes chaînes de recherche spécifiées. Par exemple, la recherche de « a,b,c » dans « a,b,c,d » devrait donner une correspondance.

Une solution supérieure :

Au lieu d'enchaîner plusieurs appels find_in_set avec des opérateurs OR (ce qui peut être inefficace), une méthode plus efficace exploite la fonction FIND_IN_SET au sein d'une clause WHERE plus structurée :

<code class="language-sql">WHERE FIND_IN_SET('val1', setcolumn) > 0
  AND FIND_IN_SET('val2', setcolumn) > 0
  AND FIND_IN_SET('val3', setcolumn) > 0</code>

où :

  • setcolumn représente le champ avec des valeurs séparées par des virgules.
  • val1, val2, val3, etc., sont les chaînes de recherche.

Explication :

Cette approche utilise AND pour garantir que toutes les chaînes de recherche sont présentes dans le setcolumn. Chaque appel FIND_IN_SET renvoie une position si la chaîne est trouvée (une valeur supérieure à 0) ; sinon, il renvoie 0. La condition AND garantit que seuls les enregistrements contenant toutes les chaînes spécifiées sont renvoyés.

Exemple :

<code class="language-sql">SELECT * FROM table
WHERE FIND_IN_SET('a', setcolumn) > 0
  AND FIND_IN_SET('b', setcolumn) > 0
  AND FIND_IN_SET('c', setcolumn) > 0;</code>

Cette requête renverra uniquement les enregistrements où setcolumn contient « a », « b » et « c ».

Considérations importantes :

Bien que cette méthode soit généralement plus efficace que l'approche REGEXP, n'oubliez pas que le stockage de valeurs séparées par des virgules dans un champ de base de données est souvent considéré comme une mauvaise conception de base de données. La normalisation de votre base de données (création de tables séparées pour représenter les relations) est une bien meilleure solution à long terme en termes de performances et d'intégrité des données. Cette approche est avant tout une solution de contournement pour les données existantes non normalisées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn