首頁 > 資料庫 > mysql教程 > 為什麼我的 MySQL `NOT IN` 查詢會拋出「運算元應包含 1 列」錯誤?

為什麼我的 MySQL `NOT IN` 查詢會拋出「運算元應包含 1 列」錯誤?

Mary-Kate Olsen
發布: 2025-01-12 10:00:42
原創
741 人瀏覽過

Why Does My MySQL `NOT IN` Query Throw an

MySQL NOT IN 查詢中的「運算元應包含 1 列」錯誤

在 MySQL 查詢中使用 NOT IN 運算子時,請務必確保右側運算元(子查詢)僅包含一列。但是,在某些情況下,我們可能會遇到「運算元應包含 1 列」錯誤,尤其是在子查詢中使用聚合函數(如 COUNT())時。

考慮以下查詢:

<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 子句右側的子查詢必須只傳回單列資料。

以上是為什麼我的 MySQL `NOT IN` 查詢會拋出「運算元應包含 1 列」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板