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
Libérer: 2025-01-12 10:00:42
original
806 Les gens l'ont consulté

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 :

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
)
Copier après la connexion

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 :

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
);
Copier après la connexion

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 :

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
);
Copier après la connexion

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 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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal