MySQL - operand powinien zawierać 1 kolumnę (y)

92

Podczas pracy nad systemem, który tworzę, próbowałem użyć następującego zapytania w moim projekcie:

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” jest powiązany z moim kodem PHP, ponieważ używam PDO. 2 to poprawna wartość dla „: cat”.

Jednak to zapytanie daje mi błąd: „# 1241 - Operand powinien zawierać 1 kolumnę (kolumny)”

Uderza mnie to, że myślę, że to zapytanie nie zadziała. Zaznaczanie kolumn, a następnie wybieranie kolejnych dwóch z innej tabeli i kontynuowanie od tego miejsca. Po prostu nie mogę zrozumieć, w czym jest problem.

Czy istnieje proste rozwiązanie tego problemu lub inny sposób zapisania zapytania?

Bill Karwin
źródło

Odpowiedzi:

103

Twoje podzapytanie wybiera dwie kolumny, podczas gdy używasz go do rzutowania jednej kolumny (jako część SELECTklauzuli zewnętrznej ). W tym kontekście możesz wybrać tylko jedną kolumnę z takiego zapytania.

usersZamiast tego rozważ dołączenie do stołu; zapewni to większą elastyczność przy wyborze kolumn, z których chcesz 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
źródło
Dzięki za odpowiedzi. Poprawię swoje zapytanie i oznaczę Cię jako odpowiedź, ale czy uważasz, że istnieje „lepszy” sposób na napisanie zapytania niż ten, którego używam teraz (ale również pomijając błąd w nim)?
Ach. Dziękuję za zmianę w Twoim oryginalnym poście. Z pewnością oznaczę Cię jako odpowiedź, gdy StackOverflow mi na to pozwoli. Wielkie dzięki!
Cóż, COUNT()trochę to odrzuca; zapytanie, które podałem, prawdopodobnie spowoduje błąd z powodu agregacji. Może być konieczne przeniesienie tej agregacji do podzapytania, w zależności od celów zapytania (które nie są dla mnie w tej chwili jasne).
cdhowie
17

Ten błąd może również wystąpić, jeśli przypadkowo użyjesz przecinków zamiast ANDw ONklauzuli a JOIN:

JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
                                                        ^
                                             should be AND, not a comma
Silkfire
źródło
9

Ten błąd może również wystąpić, jeśli przypadkowo użyjesz =zamiast INw WHEREklauzuli:

NA PRZYKŁAD:

WHERE product_id = (1,2,3);
jay padaliya
źródło
1
Lub LIKE zamiast IN, jak zrobiłem i nie mogłem znaleźć przyczyny tego błędu. ty dla wskaźnika.
Edgars Aivars
Może się to również zdarzyć, jeśli umieścisz nawiasy wokół pól w klauzuli SELECT, np. SELECT (Field1, Field2) FROM Table
Paul Chris Jones
6
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)

Cóż, nie można uzyskać wielu kolumn z jednego takiego podzapytania. Na szczęście druga kolumna już jest posts.posted_by! Więc:

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-
źródło
1

W moim przypadku problem polegał na tym, że przez pomyłkę otoczyłem wybór kolumn nawiasami:

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

I musi być:

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

Brzmi głupio, ale powodował ten błąd i jego ustalenie zajęło trochę czasu.

Mauro Bilotti
źródło
Nie mogę uwierzyć, że to jest mój problem, myślałem, że nawiasy są tam legalne
Josh McGee
0

Innym miejscem, w którym ten błąd może wystąpić, jest przypisanie wartości, której przecinek znajduje się poza ciągiem. Na przykład:

SET totalvalue = (IFNULL(i.subtotal,0) + IFNULL(i.tax,0),0)
iAndy
źródło
0

Ten błąd może również wystąpić, jeśli przypadkowo przegapisz ifnazwę funkcji.

na przykład:

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

Mam ten problem, gdy przegapiłem umieszczenie if w iffunkcji!

Jagan Kornana
źródło
0
(SELECT users.username AS posted_by,
users.id AS posted_by_id
FROM users
WHERE users.id = posts.posted_by)

Tutaj używasz zapytania podrzędnego, ale to zapytanie podrzędne musi zwrócić tylko jedną kolumnę. Oddziel go, w przeciwnym razie pokaże błąd.

Moshiur Rahman
źródło
0

Otrzymałem ten błąd podczas wykonywania skryptu MySQL w konsoli Intellij z powodu dodania nawiasów w niewłaściwym miejscu:

ŹLE:

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

DOBRZE:

SELECT user.id
FROM user
WHERE id IN :ids; # No brackets is correct
Janac Meena
źródło
to nie pasuje do pierwszej odpowiedzi tutaj: stackoverflow.com/questions/24551177/…
rubydio
@rubydio, to pytanie odnosi się do HQL i Hibernate, podczas gdy moja odpowiedź dotyczy MySQL w konsoli Intellij
Janac Meena