Maison > base de données > tutoriel mysql > FIND_IN_SET() vs IN() : quand dois-je utiliser chaque fonction pour les requêtes multi-tables ?

FIND_IN_SET() vs IN() : quand dois-je utiliser chaque fonction pour les requêtes multi-tables ?

Patricia Arquette
Libérer: 2024-12-11 08:02:13
original
434 Les gens l'ont consulté

FIND_IN_SET() vs. IN(): When Should I Use Each Function for Multi-Table Queries?

FIND_IN_SET() vs IN() : Comprendre les différences de requête

Lors de l'interrogation de données à partir de plusieurs tables, il est crucial de comprendre comment la syntaxe que vous l’utilisation affecte les résultats. Considérez la situation suivante :

Vous disposez de deux tables, une pour les commandes et une pour les entreprises. La table des commandes contient une colonne attachmentCompanyIDs avec des ID d'entreprise séparés par des virgules, et la table de l'entreprise contient des colonnes CompanyID et name.

Requête avec FIND_IN_SET()

La requête ci-dessous vous permet de récupérer tous les noms de sociétés associés à une commande spécifique :

SELECT name FROM orders, company
WHERE orderID = 1 AND FIND_IN_SET(companyID, attachedCompanyIDs)
Copier après la connexion

Cette requête renvoie avec succès tous les noms de sociétés : Société 1, Another Company et StackOverflow.

Requête avec IN()

Cependant, si vous modifiez légèrement la requête en remplaçant FIND_IN_SET() par IN(), le les résultats changent :

SELECT name FROM orders, company
WHERE orderID = 1 AND companyID IN (attachedCompanyIDs)
Copier après la connexion

Dans ce cas, la requête renvoie uniquement le premier nom de société répertorié dans la colonne attachmentCompanyIDs : Company 1.

Comprendre la différence

La raison de cette disparité réside dans la façon dont ces deux fonctions traitent la colonne attachmentCompanyIDs.

  • FIND_IN_SET() : Cette fonction considère la chaîne entière des attachmentCompanyIDs et vérifie la présence de companyID qu'il contient.
  • IN() : Cette fonction interprète les attachmentCompanyIDs comme une valeur scalaire (par exemple, un nombre unique) et vérifie s'il correspond à l'identifiant d'entreprise fourni.

Problème potentiel avec IN()

Dans votre exemple de base de données, attachmentCompanyIDs est stocké sous forme de chaîne. Lorsqu'il est utilisé dans la fonction IN(), il est automatiquement converti en un entier. Cependant, ce casting ne prend en compte que le premier chiffre avant la virgule. Par conséquent, seul le premier ID d'entreprise dans la liste attachmentCompanyIDs est pris en compte.

Solutions possibles

  • Utilisez une jointure de table directe : Rejoindre les tables de commandes et d'entreprises sur la colonne companyID pour récupérer les noms d'entreprises. Cette approche garantit des résultats précis, mais peut avoir un impact sur les performances si de nombreux identifiants d'entreprise sont associés à chaque commande.
  • Utilisez une requête plus avancée : Si vous avez un nombre limité de valeurs dans Dans la colonne attachmentCompanyIDs, vous pouvez utiliser une requête plus complexe comme celle-ci :

    SELECT name
    FROM orders
    CROSS JOIN (
      SELECT 1 AS pos
      UNION ALL
      SELECT 2 AS pos
      UNION ALL
      SELECT 3 AS pos
      UNION ALL
      SELECT 4 AS pos
      UNION ALL
      SELECT 5 AS pos
    ) q
    JOIN company
    ON companyID = CAST(NULLIF(SUBSTRING_INDEX(attachedCompanyIDs, ',', -pos), SUBSTRING_INDEX(attachedCompanyIDs, ',', 1 - pos)) AS UNSIGNED)
    Copier après la connexion

Cette requête extrait les identifiants d'entreprise individuels de la Chaîne attachmentCompanyIDs utilisant la fonction SUBSTRING_INDEX().

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