Rumah > pangkalan data > tutorial mysql > Mengapa Pertanyaan MySQL `NOT IN` Saya Membuang Ralat 'Operand Harus Mengandungi 1 Lajur'?

Mengapa Pertanyaan MySQL `NOT IN` Saya Membuang Ralat 'Operand Harus Mengandungi 1 Lajur'?

Mary-Kate Olsen
Lepaskan: 2025-01-12 10:00:42
asal
741 orang telah melayarinya

Why Does My MySQL `NOT IN` Query Throw an

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan