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
Libérer: 2024-12-18 04:12:15
original
581 Les gens l'ont consulté

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)
Copier après la connexion

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)
Copier après la connexion

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)
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal