MySQL NOT IN
"Operand harus mengandungi 1 lajur" ralat dalam pertanyaan
Apabila menggunakan operator NOT IN
dalam pertanyaan MySQL, adalah penting untuk memastikan bahawa operan sebelah kanan (subquery) mengandungi hanya satu lajur. Walau bagaimanapun, dalam sesetengah kes kita mungkin menghadapi ralat "operand harus mengandungi 1 lajur", terutamanya apabila menggunakan fungsi agregat seperti COUNT()
dalam subkueri.
Pertimbangkan pertanyaan berikut:
<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>
Pertanyaan ini bertujuan untuk memilih semua aktiviti yang tiada dalam subkueri yang mengira bilangan entri yang disiarkan untuk setiap aktiviti dan menapis keluar masukan tersebut yang bilangannya kurang daripada kekerapan aktiviti. Walau bagaimanapun, MySQL membuang ralat "operand harus mengandungi 1 lajur" kerana kehadiran berbilang lajur dalam subquery.
Penyelesaian:
Untuk menyelesaikan masalah ini, kita perlu mengubah suai subkueri untuk memastikan ia hanya mengembalikan lajur id_campaign
. Berikut ialah versi pertanyaan yang diubah suai:
<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>
Dalam subquery yang dikemas kini ini, kami hanya menayangkan lajur id_campaign
, sekali gus menyelesaikan ralat. Pertanyaan kini betul-betul mengecualikan kempen yang bilangan kemasukan yang diservis kurang daripada kekerapan kempen.
Atau, untuk kod yang lebih jelas, anda boleh menulis semula seperti ini:
<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>
Versi ini memilih NOT IN
terus dalam klausa id_campaign
, mengelakkan subkueri bersarang dan menjadikan kod lebih ringkas dan boleh dibaca. Kuncinya ialah subkueri di sebelah kanan klausa NOT IN
mesti mengembalikan hanya satu lajur data.
Atas ialah kandungan terperinci Mengapa Pertanyaan MySQL `NOT IN` Saya Membuang Ralat 'Operand Harus Mengandungi 1 Lajur'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!