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, что означает, что скобки в приведенном выше фрагменте будут дважды обертывать список столбцов, вызывающих ошибку.

Другие вопросы по тегам