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
Libérer: 2025-01-12 06:43:44
original
558 Les gens l'ont consulté

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 :

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

Copier après la connexion

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