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
Lepaskan: 2025-01-12 09:48:43
asal
819 orang telah melayarinya

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

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

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!

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