Rumah >pangkalan data >tutorial mysql >Mengapa Subquery MySQL `NOT IN` Saya dengan Berbilang Lajur Mengembalikan 'Operand Harus Mengandungi 1 Lajur'?

Mengapa Subquery MySQL `NOT IN` Saya dengan Berbilang Lajur Mengembalikan 'Operand Harus Mengandungi 1 Lajur'?

Susan Sarandon
Susan Sarandonasal
2025-01-12 09:48:43847semak imbas

Why Does My MySQL `NOT IN` Subquery with Multiple Columns Return

MySQL NOT IN "Operasi harus mengandungi 1 lajur" ralat yang disebabkan oleh berbilang lajur dalam subquery

Ia adalah perkara biasa untuk menghadapi ralat "operand harus mengandungi 1 lajur" apabila menggunakan klausa NOT IN subkueri yang mengandungi berbilang lajur. Ralat ini timbul daripada sekatan bahawa klausa NOT IN menjangkakan subkueri hanya mengembalikan satu lajur.

Dalam pertanyaan yang disediakan:

<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>

Subquery mengembalikan lapan lajur (id_campaign, nama, kekerapan, negara, rujukan, bida, status dan countcap). Walau bagaimanapun, klausa NOT IN memerlukan satu lajur untuk perbandingan.

Penyelesaian:

Untuk membetulkan ralat ini, kita perlu mengubah suai subkueri supaya ia hanya mengembalikan lajur id_campaign, iaitu lajur yang kami ingin semak untuk tidak menjadi ahli dalam pertanyaan utama:

<code class="language-sql">SELECT *
FROM campaigns 
WHERE id NOT IN (
    SELECT id_campaign
    FROM (
        SELECT e.id_campaign AS id_campaign, d.frequency, e.id
        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>

Dengan mengehadkan hasil subkueri kepada satu lajur id_campaign, kami menghapuskan ralat "operand harus mengandungi 1 lajur" dan memastikan klausa NOT IN melakukan perbandingan dengan betul. Harap maklum bahawa kami menambahkan alias subquery untuk mengatur pertanyaan dengan lebih jelas. Pertanyaan yang diubah suai ini hanya akan mengembalikan baris dalam jadual campaigns dengan id tiada dalam hasil subkueri.

Atas ialah kandungan terperinci Mengapa Subquery MySQL `NOT IN` Saya dengan Berbilang Lajur Mengembalikan 'Operand Harus Mengandungi 1 Lajur'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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