MySQL - Operand sollte 1 Spalte (n) enthalten

87

Während der Arbeit an einem System, das ich erstelle, habe ich versucht, die folgende Abfrage in meinem Projekt zu verwenden:

SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by,
    users.id AS posted_by_id
    FROM users
    WHERE users.id = posts.posted_by)
FROM topics
LEFT OUTER JOIN posts ON posts.topic_id = topics.id
WHERE topics.cat_id = :cat
GROUP BY topics.id

": cat" ist an meinen PHP-Code gebunden, da ich PDO verwende. 2 ist ein gültiger Wert für ": cat".

Diese Abfrage gibt mir jedoch einen Fehler: "# 1241 - Operand sollte 1 Spalte (n) enthalten"

Was mich verblüfft ist, dass ich denken würde, dass diese Abfrage kein Problem funktionieren würde. Wählen Sie Spalten aus, wählen Sie dann zwei weitere aus einer anderen Tabelle aus und fahren Sie von dort aus fort. Ich kann einfach nicht herausfinden, wo das Problem liegt.

Gibt es eine einfache Lösung oder eine andere Möglichkeit, meine Anfrage zu schreiben?

Bill Karwin
quelle

Antworten:

100

Ihre Unterabfrage wählt zwei Spalten aus, während Sie damit eine Spalte projizieren (als Teil der äußeren SELECTKlausel). In diesem Zusammenhang können Sie aus einer solchen Abfrage nur eine Spalte auswählen.

Ziehen Sie usersstattdessen in Betracht, sich dem Tisch anzuschließen . Dies gibt Ihnen mehr Flexibilität bei der Auswahl der gewünschten Spalten users.

SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
COUNT( posts.solved_post ) AS solved_post,
users.username AS posted_by,
users.id AS posted_by_id

FROM topics

LEFT OUTER JOIN posts ON posts.topic_id = topics.id
LEFT OUTER JOIN users ON users.id = posts.posted_by

WHERE topics.cat_id = :cat
GROUP BY topics.id
cdhowie
quelle
Danke für die Antwort. Ich werde meine Anfrage korrigieren und Sie als Antwort markieren, aber glauben Sie, dass es nur zur Eingabe eine "bessere" Möglichkeit gibt, meine Anfrage zu schreiben, als die, die ich jetzt verwende (aber auch den darin enthaltenen Fehler außer Acht lässt)?
Ah. Vielen Dank für die Bearbeitung Ihres ursprünglichen Beitrags. Ich werde Sie sicher als Antwort markieren, wenn StackOverflow es mir erlaubt. Vielen Dank!
Nun, das COUNT()wirft die Dinge ein bisschen weg; Die Abfrage, die ich gegeben habe, wird wahrscheinlich aufgrund der Aggregation einen Fehler ergeben. Abhängig von den Zielen Ihrer Abfrage (die mir derzeit nicht klar sind) müssen Sie diese Aggregation möglicherweise in eine Unterabfrage verschieben.
CDhowie
16

Dieser Fehler kann auch auftreten, wenn Sie versehentlich Kommas anstelle ANDder ONKlausel a verwenden JOIN:

JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
                                                        ^
                                             should be AND, not a comma
Seidenfeuer
quelle
9

Dieser Fehler kann auch auftreten, wenn Sie versehentlich =anstelle INder folgenden WHEREKlausel verwenden:

BEISPIELSWEISE:

WHERE product_id = (1,2,3);
Jay Padaliya
quelle
1
Oder LIKE anstelle von IN wie ich und konnte nicht herausfinden, warum dieser Fehler auftritt. ty für Zeiger.
Edgars Aivars
Dies kann auch passieren, wenn Sie die Felder in der SELECT-Klausel in Klammern setzen, z. B. SELECT (Field1, Field2) FROM Table
Paul Chris Jones
5
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by,
    users.id AS posted_by_id
    FROM users
    WHERE users.id = posts.posted_by)

Nun, Sie können nicht mehrere Spalten von einer solchen Unterabfrage erhalten. Zum Glück ist die zweite Spalte schon posts.posted_by! So:

SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
posts.posted_by
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by_username
    FROM users
    WHERE users.id = posts.posted_by)
...
Ry-
quelle
0

Eine andere Stelle, an der dieser Fehler auftreten kann, ist die Zuweisung eines Werts, der ein Komma außerhalb einer Zeichenfolge enthält. Beispielsweise:

SET totalvalue = (IFNULL(i.subtotal,0) + IFNULL(i.tax,0),0)
iAndy
quelle
0

Dieser Fehler kann auch auftreten, wenn Sie versehentlich den ifFunktionsnamen verpassen .

beispielsweise:

set v_filter_value = 100;

select
    f_id,
    f_sale_value
from
    t_seller
where
    f_id = 5
    and (v_filter_value <> 0, f_sale_value = v_filter_value, true);

Habe dieses Problem, als ich es verpasst habe, wenn in die ifFunktion zu setzen!

Jagan Kornana
quelle
0
(SELECT users.username AS posted_by,
users.id AS posted_by_id
FROM users
WHERE users.id = posts.posted_by)

Hier verwenden Sie eine Unterabfrage, aber diese Unterabfrage darf nur eine Spalte zurückgeben. Trennen Sie es, sonst wird ein Fehler angezeigt.

Moshiur Rahman
quelle
0

In meinem Fall bestand das Problem darin, dass ich meine Spaltenauswahl versehentlich in Klammern gesetzt habe:

SELECT (p.column1, p.colum2, p.column3) FROM table1 p where id = 1;

Und muss sein:

SELECT p.column1, p.colum2, p.column3 FROM table1 p where id = 1;

Klingt albern, hat aber diesen Fehler verursacht und es hat einige Zeit gedauert, ihn herauszufinden.

Mauro Bilotti
quelle