Maison >base de données >tutoriel mysql >Pourquoi ma requête MySQL « NOT IN » renvoie-t-elle une erreur « L'opérande doit contenir 1 colonne » ?
MySQL NOT IN
Erreur "L'opérande doit contenir 1 colonne" dans la requête
Lors de l'utilisation de l'opérateur NOT IN
dans une requête MySQL, il est important de s'assurer que l'opérande de droite (sous-requête) ne contient qu'une seule colonne. Cependant, dans certains cas, nous pouvons rencontrer l'erreur « l'opérande doit contenir 1 colonne », notamment lors de l'utilisation de fonctions d'agrégation comme COUNT()
dans une sous-requête.
Considérez la requête suivante :
<code class="language-sql">SELECT * from campaigns WHERE id not in (SELECT e.id_campaign, d.name, d.frequency, d.country, d.referral, d.bid, d.status, COUNT(e.id) AS countcap FROM campaigns d LEFT JOIN served e ON d.id = e.id_campaign WHERE d.status = 'Active' GROUP BY e.id_campaign HAVING countcap < d.frequency )</code>
Cette requête vise à sélectionner toutes les activités qui ne font pas partie d'une sous-requête qui compte le nombre d'entrées servies pour chaque activité et filtre les entrées dont le nombre est inférieur à la fréquence de l'activité. Cependant, MySQL renvoie une erreur « l'opérande doit contenir 1 colonne » en raison de la présence de plusieurs colonnes dans la sous-requête.
Solution :
Pour résoudre ce problème, nous devons modifier la sous-requête pour nous assurer qu'elle ne renvoie que les colonnes id_campaign
. Voici la version modifiée de la requête :
<code class="language-sql">SELECT * FROM campaigns WHERE id NOT IN ( SELECT id_campaign FROM ( SELECT e.id_campaign AS id_campaign, d.frequency, COUNT(e.id) AS countcap FROM campaigns d LEFT JOIN served e ON d.id = e.id_campaign WHERE d.status = 'Active' GROUP BY e.id_campaign HAVING count(e.id) < d.frequency ) AS subquery );</code>
Dans cette sous-requête mise à jour, nous projetons uniquement les colonnes id_campaign
, résolvant ainsi l'erreur. La requête exclut désormais correctement les campagnes pour lesquelles le nombre d'entrées desservies est inférieur à la fréquence de la campagne.
Ou, pour un code plus clair, vous pouvez le réécrire comme ceci :
<code class="language-sql">SELECT c.* FROM campaigns c WHERE c.id NOT IN ( SELECT e.id_campaign FROM campaigns d LEFT JOIN served e ON d.id = e.id_campaign WHERE d.status = 'Active' GROUP BY e.id_campaign HAVING COUNT(e.id) < d.frequency );</code>
Cette version sélectionne NOT IN
directement dans la clause id_campaign
, évitant les sous-requêtes imbriquées et rendant le code plus concis et lisible. La clé est que la sous-requête située à droite de la clause NOT IN
ne doit renvoyer qu'une seule colonne de données.
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!