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