MySQL – operand dient 1 kolom (s)

Tijdens het werken aan een systeem dat ik ben het creëren, probeerde ik de volgende query gebruiken in mijn project:

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” is gebonden aan mijn PHP code want ik ben met behulp van PDO. 2 is een geldige waarde voor “: cat”.

Dat vraag al geeft me een fout: “# 1241 – Operand moet 1 kolom (s) bevatten”

Wat stompen mij is dat ik zou denken dat deze vraag geen probleem zou werken. Het selecteren van kolommen, dan is het selecteren van twee meer uit een andere tafel, en verder op vanaf daar. Ik kan het gewoon niet achterhalen wat het probleem is.

Is er een eenvoudige oplossing voor dit, of een andere manier om mijn vraag te schrijven?


Antwoord 1, Autoriteit 100%

Uw subzoekopdracht is het selecteren van twee kolommen, terwijl u het aan één kolom te projecteren (als onderdeel van de buitenste SELECTclausule). U kunt slechts één kolom uit een dergelijke vraag in deze context.

Je kunt ook lid van de userstafel in plaats; dit zal u meer flexibiliteit te geven bij de keuze van welke kolommen je wilt van 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

Antwoord 2, autoriteit 15%

Deze fout kan ook optreden als u per ongeluk komma’s gebruikt in plaats van ANDin de ON-clausule van een JOIN:

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

Antwoord 3, autoriteit 9%

Deze fout kan ook optreden als u per ongeluk =gebruikt in plaats van INin de WHERE-clausule:

VOOR VOORBEELD:

WHERE product_id = (1,2,3);

Antwoord 4, autoriteit 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)

Nou, je kunt niet meerdere kolommen op die manier uit één subquery halen. Gelukkig is de tweede kolom al posts.posted_by! Dus:

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

Antwoord 5, autoriteit 4%

In mijn geval was het probleem dat ik per ongeluk mijn kolomselectie tussen haakjes zette:

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

En moet zijn:

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

Klinkt gek, maar het veroorzaakte deze fout en het kostte wat tijd om erachter te komen.


Antwoord 6

Deze fout kan ook optreden als u per ongeluk de functienaam ifmist.

bijvoorbeeld:

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

Ik kreeg dit probleem toen ik ifniet in de functie ifhad gezet!


Antwoord 7

Ik kreeg deze fout tijdens het uitvoeren van een MySQL-script in een Intellij-console, vanwege het toevoegen van haakjes op de verkeerde plaats:

VERKEERD:

SELECT user.id
FROM user
WHERE id IN (:ids); # Do not put brackets around list argument

RECHTS:

SELECT user.id
FROM user
WHERE id IN :ids; # No brackets is correct

Antwoord 8

Een andere plaats waar deze fout kan optreden, is het toewijzen van een waarde met een komma buiten een tekenreeks. Bijvoorbeeld:

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

Antwoord 9

(SELECT users.username AS posted_by,
users.id AS posted_by_id
FROM users
WHERE users.id = posts.posted_by)

Hier gebruikt u subquery, maar deze subquery moet slechts één kolom retourneren.
Scheid het, anders wordt er een fout weergegeven.

Other episodes