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 サイトの他の関連記事を参照してください。