Maison >base de données >tutoriel mysql >Comment corriger l'erreur « L'opérande doit contenir 1 colonne » dans la sous-requête NOT IN de MySQL ?
Erreur MySQL « L'opérande doit contenir 1 colonne » dans les sous-requêtes NOT IN : une solution
La clause NOT IN
de MySQL exige que la sous-requête renvoie une seule colonne. La requête suivante génère l'erreur « L'opérande doit contenir 1 colonne » car la sous-requête renvoie plusieurs colonnes :
<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>
Le problème réside dans la sélection de plusieurs champs (par exemple, e.id_campaign
, d.name
, d.frequency
, etc.) dans la sous-requête. NOT IN
attend une seule colonne pour la comparaison.
La solution : utiliser une table dérivée
Pour corriger cela, nous pouvons utiliser une table dérivée (une sous-requête dans la clause FROM
) pour isoler la colonne pertinente :
<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>
Cette requête révisée utilise une table dérivée nommée subquery
. Cette requête interne exécute la logique d'origine, mais sélectionne uniquement e.id_campaign
(alias id_campaign
), garantissant que la clause externe NOT IN
reçoit un jeu de résultats à une seule colonne, résolvant ainsi l'erreur. La logique de filtrage d'origine basée sur frequency
et countcap
est conservée dans la table dérivée.
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!