MySQL - операнд должен содержать 1 столбец
Работая над системой, которую я создаю, я попытался использовать следующий запрос в моем проекте:
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" связан моим PHP-кодом, так как я использую PDO. 2 является допустимым значением для ":cat".
Этот запрос, однако, дает мне ошибку: "#1241 - Операнд должен содержать 1 столбец (и)"
Что меня озадачивает, так это то, что я думаю, что этот запрос не сработает. Выбор столбцов, затем выбор еще двух из другой таблицы и продолжение с этого момента. Я просто не могу понять, в чем проблема.
Есть ли простое исправление этого или другой способ написать мой запрос?
11 ответов
Ваш подзапрос выбирает два столбца, в то время как вы используете его для проецирования одного столбца (как часть внешнего SELECT
пункт). В этом контексте вы можете выбрать только один столбец из такого запроса.
Рассмотреть возможность присоединения к users
вместо таблицы; это даст вам больше гибкости при выборе колонок, из которых вы хотите 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
В моем случае проблема заключалась в том, что я по ошибке заключил свой выбор столбцов круглыми скобками:
SELECT (p.column1, p.colum2, p.column3) FROM table1 p where id = 1;
И должно быть:
SELECT p.column1, p.colum2, p.column3 FROM table1 p where id = 1;
Звучит глупо, но это было причиной этой ошибки, и потребовалось некоторое время, чтобы понять ее.
Эта ошибка также может возникнуть, если вы случайно используете запятые вместо AND
в ON
пункт о JOIN
:
JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
^
should be AND, not a comma
Эта ошибка также может возникнуть, если вы случайно используете =
вместо IN
в WHERE
пункт:
НАПРИМЕР:
WHERE product_id = (1,2,3);
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)
Ну, вы не можете получить несколько столбцов из одного подзапроса. К счастью, второй столбец уже posts.posted_by
! Так:
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)
...
Я получил эту ошибку при выполнении сценария MySQL в консоли Intellij из-за добавления скобок в неправильном месте:
НЕПРАВИЛЬНО:
SELECT user.id
FROM user
WHERE id IN (:ids); # Do not put brackets around list argument
ПРАВИЛЬНО:
SELECT user.id
FROM user
WHERE id IN :ids; # No brackets is correct
Эта ошибка также может возникнуть, если вы случайно пропустили if
имя функции.
например:
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);
Получил эту проблему, когда я пропустил, если вif
функция!
У меня также есть такая же проблема при создании базы данных компании. это код
SELECT FNAME,DNO FROM EMP
WHERE SALARY IN (SELECT MAX(SALARY), DNO
FROM EMP GROUP BY DNO);
(SELECT users.username AS posted_by,
users.id AS posted_by_id
FROM users
WHERE users.id = posts.posted_by)
Здесь вы используете подзапрос, но этот подзапрос должен возвращать только один столбец. Отделите его, иначе будет отображаться ошибка.
Еще одно место, в котором может возникнуть эта ошибка, - это присвоение значения, которое содержит запятую за пределами строки. Например:
SET totalvalue = (IFNULL(i.subtotal,0) + IFNULL(i.tax,0),0)
У меня также было это сообщение об ошибке при использовании Dapper с MySQL. Пример кода ниже:
SELECT ColA, ColB, ColC
FROM Table
WHERE ColA IN (@listOfColumns);
Проблема с приведенным выше кодом заключается в том, что Dapper автоматически добавит скобки для замены параметра @listOfColumns, что означает, что скобки в приведенном выше фрагменте будут дважды обертывать список столбцов, вызывающих ошибку.