Maison >base de données >tutoriel mysql >FIND_IN_SET() vs IN() dans MySQL : quand dois-je utiliser chacun d'eux ?

FIND_IN_SET() vs IN() dans MySQL : quand dois-je utiliser chacun d'eux ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-18 04:12:15575parcourir

FIND_IN_SET() vs. IN() in MySQL: When Should I Use Each?

Find_in_set() vs IN() : Comprendre la différence

Dans MySQL, les opérateurs FIND_IN_SET() et IN() jouent un rôle crucial dans l'interrogation des données des tables. Bien que les deux puissent être utilisés pour tester l'appartenance à un ensemble de valeurs, ils diffèrent dans la manière dont ils gèrent des scénarios spécifiques.

Considérez la requête suivante, qui vise à récupérer les noms des entreprises associées à une commande :

SELECT name
FROM orders, company
WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)

Cette requête génère avec succès les trois noms de société : Société 1, Une autre société et StackOverflow. Cependant, si l'on remplace FIND_IN_SET() par IN(), le résultat est inattendu :

SELECT name
FROM orders, company
WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)

Dans ce cas, seul le premier nom de l'entreprise, Société 1, est renvoyé. Pour comprendre pourquoi, il est essentiel de saisir les mécanismes sous-jacents de ces opérateurs.

FIND_IN_SET()

FIND_IN_SET() effectue une recherche littérale d'une valeur spécifique entre une virgule. -chaîne séparée. Dans ce cas, attachmentCompanyIDs contient une chaîne telle que « 1,2,3 ». FIND_IN_SET() renvoie la position de la valeur cible (1, 2 ou 3) dans cette chaîne, ou 0 si elle n'est pas trouvée.

IN()

IN (), d'autre part, attend une liste de valeurs à comparer à la valeur cible. Cependant, dans MySQL, attachmentCompanyIDs est une valeur scalaire, pas un tableau ou une liste. Ainsi, MySQL tente de convertir cette chaîne scalaire en un entier (le type de companyID) pour la comparaison IN().

Pendant la conversion, MySQL interprète la première virgule de la chaîne (« 1,2,3 » ) comme fin de la partie numérique, ce qui donne une valeur entière de 1. Essentiellement, la condition IN() devient effectivement :

companyID IN (1)

Cela explique pourquoi seule la première entreprise le nom, Société 1, est récupéré. La condition IN() n'est vraie que pour la première valeur de la chaîne séparée par des virgules.

Solutions

Si l'hypothèse est que le nombre de valeurs dans la virgule -Les listes séparées sont limitées, on peut utiliser des approches alternatives pour gérer efficacement de tels scénarios.

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