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)
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)
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.
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 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)
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!