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!