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中文網其他相關文章!