Maison >base de données >tutoriel mysql >Pourquoi ma requête MySQL `NOT IN` avec `COUNT()` entraîne-t-elle une erreur « L'opérande doit contenir 1 colonne » ?

Pourquoi ma requête MySQL `NOT IN` avec `COUNT()` entraîne-t-elle une erreur « L'opérande doit contenir 1 colonne » ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-12 06:43:44489parcourir

Why Does My MySQL `NOT IN` Query with `COUNT()` Result in an

Erreur MySQL « L'opérande doit contenir 1 colonne » dans les NOT IN sous-requêtes avec fonctions d'agrégation

L'utilisation de NOT IN sous-requêtes dans MySQL nécessite une attention particulière au nombre de colonnes. Une erreur courante, « L'opérande doit contenir 1 colonne », se produit lorsque la sous-requête utilise des fonctions d'agrégation telles que COUNT(), renvoyant plusieurs colonnes. L'opérateur NOT IN de MySQL attend une comparaison sur une seule colonne.

Cause fondamentale :

L'erreur provient d'une inadéquation dans le nombre de colonnes renvoyées par la requête principale et la sous-requête. La sous-requête NOT IN, contenant une fonction d'agrégation, produit un ensemble de résultats avec plus d'une colonne, en conflit avec la id à colonne unique dans la clause WHERE de la requête principale.

Exemple illustratif :

Considérez cette requête problématique :

<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 < p>The intention is to select campaigns *not* included in the subquery's results. The subquery, however, returns eight columns, causing the "Operand should contain 1 column" error because `NOT IN` expects a single-column comparison against the `id` column in the `campaigns` table.</p><p>**Resolution:**</p><p>The solution involves restructuring the subquery to return only the `id_campaign` column:</p><pre class="brush:php;toolbar:false"><code class="language-sql">SELECT *
FROM campaigns
WHERE 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) < 
</code>

Alternatively, for situations requiring multiple columns, use `EXISTS` or `NOT EXISTS` for a more efficient and accurate solution:

<code class="language-sql">SELECT *
FROM campaigns c
WHERE NOT EXISTS
(
    SELECT 1
    FROM campaigns d
    INNER JOIN served e ON d.id = e.id_campaign
    WHERE d.id = c.id
      AND d.status = 'Active'
      AND COUNT(e.id) < 
</code>

This revised approach avoids the column count mismatch and provides a cleaner solution for scenarios involving aggregate functions within subqueries used with `NOT IN`.

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