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?
źródło
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).Ten błąd może również wystąpić, jeśli przypadkowo użyjesz przecinków zamiast
AND
wON
klauzuli aJOIN
:źródło
Ten błąd może również wystąpić, jeśli przypadkowo użyjesz
=
zamiastIN
wWHERE
klauzuli:NA PRZYKŁAD:
źródło
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) ...
źródło
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.
źródło
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)
źródło
Ten błąd może również wystąpić, jeśli przypadkowo przegapisz
if
nazwę 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
if
funkcji!źródło
(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.
źródło
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
źródło