Maison >base de données >tutoriel mysql >Pourquoi ma sous-requête MySQL « NOT IN » avec plusieurs colonnes renvoie-t-elle « L'opérande devrait contenir 1 colonne » ?

Pourquoi ma sous-requête MySQL « NOT IN » avec plusieurs colonnes renvoie-t-elle « L'opérande devrait contenir 1 colonne » ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-12 09:48:43823parcourir

Why Does My MySQL `NOT IN` Subquery with Multiple Columns Return

MySQL NOT IN Erreur "L'opération doit contenir 1 colonne" provoquée par plusieurs colonnes dans la sous-requête

Il est courant de rencontrer l'erreur « l'opérande doit contenir 1 colonne » lors de l'utilisation de la clause NOT IN d'une sous-requête contenant plusieurs colonnes. Cette erreur provient de la restriction selon laquelle la clause NOT IN s'attend à ce que la sous-requête ne renvoie qu'une seule colonne.

Dans la requête fournie :

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

La sous-requête renvoie huit colonnes (id_campaign, nom, fréquence, pays, référence, offre, statut et nombre). Cependant, la clause NOT IN nécessite une seule colonne pour la comparaison.

Solution :

Pour corriger cette erreur, nous devons modifier la sous-requête afin qu'elle ne renvoie que la colonne id_campaign, qui est la colonne dont nous voulons vérifier la non-appartenance à la requête principale :

<code class="language-sql">SELECT *
FROM campaigns 
WHERE id NOT IN (
    SELECT id_campaign
    FROM (
        SELECT e.id_campaign AS id_campaign, d.frequency, e.id
        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>

En limitant les résultats de la sous-requête à une seule colonne id_campaign, nous éliminons l'erreur « l'opérande doit contenir 1 colonne » et garantissons que la clause NOT IN effectue correctement la comparaison. Notez que nous avons ajouté un alias subquery pour organiser la requête plus clairement. Cette requête modifiée ne renverra que les lignes de la table campaignsid ne figure pas dans les résultats de la sous-requête.

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