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 » ?

Pourquoi ma requête MySQL « NOT IN » renvoie-t-elle une erreur « L'opérande doit contenir 1 colonne » ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-12 10:00:42769parcourir

Why Does My MySQL `NOT IN` Query Throw an

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!

Déclaration:
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