Maison > base de données > tutoriel mysql > MySQL FIND_IN_SET() vs IN() : pourquoi IN() renvoie-t-il uniquement la première correspondance avec des identifiants séparés par des virgules ?

MySQL FIND_IN_SET() vs IN() : pourquoi IN() renvoie-t-il uniquement la première correspondance avec des identifiants séparés par des virgules ?

Mary-Kate Olsen
Libérer: 2024-12-11 10:40:12
original
578 Les gens l'ont consulté

MySQL FIND_IN_SET() vs IN(): Why Does IN() Only Return the First Match with Comma-Separated IDs?

FIND_IN_SET() vs IN() : Comprendre la différence dans MySQL

Question :

Dans MySQL, nous avons deux tables : « commandes » et « entreprise ». La colonne "attachedCompanyIDs" dans "orders" stocke une liste d'ID séparés par des virgules faisant référence aux lignes de "company". Lors d'une requête sur les noms de sociétés associés à une commande à l'aide de FIND_IN_SET(), nous obtenons les résultats attendus. Cependant, l’utilisation de IN() renvoie uniquement la première société correspondante. Pourquoi cela se produit-il ?

Réponse :

La colonne attachmentCompanyIDs est une valeur scalaire de type VARCHAR. Lors de l'utilisation de IN(), MySQL convertit la chaîne en un entier, en la tronquant au premier caractère non numérique (c'est-à-dire une virgule). Cela signifie que si attachmentCompanyIDs contient plusieurs valeurs, seule la première sera prise en compte pour la comparaison IN.

解决方法:

En fonction de votre scénario spécifique, il existe plusieurs solutions de contournement pour ce problème :

  1. Utiliser les types ARRAY (PostgreSQL uniquement) : PostgreSQL prend en charge les types de données tableau, vous permettant de stocker des listes séparées par des virgules sous forme de tableaux. Cela vous permet d'utiliser ANY() pour comparer correctement les valeurs dans attachmentCompanyIDs avec la colonne companyID.
  2. Listes de valeurs limitées : Si la longueur des listes séparées par des virgules dans attachmentCompanyIDs est limitée, vous pouvez utiliser une série de requêtes UNION ALL pour convertir la chaîne en plusieurs lignes. Cela vous permet d'effectuer la comparaison IN sur chaque ligne séparément.

Considérations supplémentaires :

  1. Impact sur les performances : Le l'utilisation de FIND_IN_SET() peut potentiellement entraîner des problèmes de performances, en particulier pour les grands ensembles de données. L'utilisation des solutions alternatives mentionnées ci-dessus peut améliorer les performances dans ces scénarios.
  2. Lisibilité et maintenance : Les solutions alternatives peuvent être plus complexes et moins lisibles que l'utilisation de FIND_IN_SET(). Considérez attentivement les compromis entre performances et maintenabilité lorsque vous faites votre choix.

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