Heim > Datenbank > MySQL-Tutorial > Warum löst meine MySQL-Abfrage „NOT IN' den Fehler „Operand sollte 1 Spalte enthalten' aus?

Warum löst meine MySQL-Abfrage „NOT IN' den Fehler „Operand sollte 1 Spalte enthalten' aus?

Mary-Kate Olsen
Freigeben: 2025-01-12 10:00:42
Original
740 Leute haben es durchsucht

Why Does My MySQL `NOT IN` Query Throw an

MySQL NOT IN Fehler „Operand sollte 1 Spalte enthalten“ in der Abfrage

Bei Verwendung des NOT IN-Operators in einer MySQL-Abfrage ist es wichtig sicherzustellen, dass der rechte Operand (Unterabfrage) nur eine Spalte enthält. In einigen Fällen kann es jedoch zu der Fehlermeldung „Operand sollte 1 Spalte enthalten“ kommen, insbesondere wenn Aggregatfunktionen wie COUNT() in einer Unterabfrage verwendet werden.

Bedenken Sie die folgende Abfrage:

<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>
Nach dem Login kopieren

Diese Abfrage zielt darauf ab, alle Aktivitäten auszuwählen, die nicht in einer Unterabfrage enthalten sind, die die Anzahl der bereitgestellten Einträge für jede Aktivität zählt und diejenigen Einträge herausfiltert, deren Anzahl geringer ist als die Häufigkeit der Aktivität. Aufgrund des Vorhandenseins mehrerer Spalten in der Unterabfrage gibt MySQL jedoch den Fehler „Operand sollte 1 Spalte enthalten“ aus.

Lösung:

Um dieses Problem zu lösen, müssen wir die Unterabfrage ändern, um sicherzustellen, dass sie nur die id_campaign-Spalten zurückgibt. Das Folgende ist die geänderte Version der Abfrage:

<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>
Nach dem Login kopieren

In dieser aktualisierten Unterabfrage projizieren wir nur die id_campaign-Spalten und beheben so den Fehler. Die Abfrage schließt nun ordnungsgemäß Kampagnen aus, bei denen die Anzahl der bedienten Einträge geringer ist als die Kampagnenhäufigkeit.

Oder, für einen klareren Code, können Sie ihn wie folgt umschreiben:

<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>
Nach dem Login kopieren

Diese Version wählt NOT IN direkt in der id_campaign-Klausel aus, wodurch verschachtelte Unterabfragen vermieden werden und der Code prägnanter und lesbarer wird. Der Schlüssel liegt darin, dass die Unterabfrage auf der rechten Seite der NOT IN-Klausel nur eine einzige Datenspalte zurückgeben darf.

Das obige ist der detaillierte Inhalt vonWarum löst meine MySQL-Abfrage „NOT IN' den Fehler „Operand sollte 1 Spalte enthalten' aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage