ホームページ > データベース > mysql チュートリアル > MySQL の「NOT IN」クエリで「オペランドには 1 列が含まれている必要があります」エラーがスローされるのはなぜですか?

MySQL の「NOT IN」クエリで「オペランドには 1 列が含まれている必要があります」エラーがスローされるのはなぜですか?

Mary-Kate Olsen
リリース: 2025-01-12 10:00:42
オリジナル
740 人が閲覧しました

Why Does My MySQL `NOT IN` Query Throw an

MySQL NOT IN クエリでの「オペランドには 1 列を含める必要があります」エラー

MySQL クエリで NOT IN 演算子を使用する場合は、右側のオペランド (サブクエリ) に 1 つの列のみが含まれていることを確認することが重要です。ただし、場合によっては、特にサブクエリで COUNT() などの集計関数を使用する場合、「オペランドには 1 列を含める必要があります」エラーが発生することがあります。

次のクエリを考えてみましょう:

<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>
ログイン後にコピー

このクエリは、アクティビティごとに提供されたエントリの数をカウントし、カウントがアクティビティの頻度より少ないエントリをフィルタリングするサブクエリに含まれていないすべてのアクティビティを選択することを目的としています。ただし、サブクエリに複数のカラムが存在するため、MySQL は「オペランドには 1 つのカラムを含める必要があります」エラーをスローします。

解決策:

この問題を解決するには、id_campaign 列のみを返すようにサブクエリを変更する必要があります。以下はクエリの修正バージョンです:

<code class="language-sql">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
);</code>
ログイン後にコピー

この更新されたサブクエリでは、id_campaign 列のみを射影するため、エラーは解決されます。クエリは、サービスされたエントリ数がキャンペーンの頻度よりも少ないキャンペーンを正しく除外するようになりました。

または、コードをより明確にするために、次のように書き換えることもできます:

<code class="language-sql">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
);</code>
ログイン後にコピー

このバージョンでは、NOT IN 句で id_campaign を直接選択するため、ネストされたサブクエリが回避され、コードがより簡潔で読みやすくなります。 重要なのは、NOT IN 句の右側のサブクエリは 1 列のデータのみを返さなければならないということです。

以上がMySQL の「NOT IN」クエリで「オペランドには 1 列が含まれている必要があります」エラーがスローされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート