MySQL - операнд должен содержать 1 столбец (ы)

92

Работая над системой, которую я создаю, я попытался использовать в своем проекте следующий запрос:

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 столбец (и)"

Что меня озадачивает, так это то, что я думаю, что этот запрос будет работать без проблем. Выбор столбцов, затем выбор еще двух из другой таблицы и продолжение оттуда. Я просто не могу понять, в чем проблема.

Есть ли простое исправление этого или другой способ написать мой запрос?

Билл Карвин
источник

Ответы:

103

Ваш подзапрос выбирает два столбца, а вы используете его для проецирования одного столбца (как часть внешнего 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
cdhowie
источник
Спасибо за ответ. Я исправлю свой запрос и помечу вас как ответ, но только для ввода, как вы думаете, есть ли «лучший» способ написать мой запрос, чем тот, который я использую сейчас (но при этом не обращая внимания на ошибку в нем)?
Ах. Спасибо за редактирование вашего исходного сообщения. Я обязательно отмечу вас как ответ, когда StackOverflow позволит мне. Большое спасибо!
Ну, COUNT()это немного сбивает с толку; запрос, который я дал, вероятно, выдаст ошибку из-за агрегирования. Возможно, вам придется переместить эту агрегацию в подзапрос, в зависимости от целей вашего запроса (которые мне пока не ясны).
cdhowie
17

Эта ошибка также может произойти , если вы случайно использовать запятые вместо ANDв ONпредложении о наличии JOIN:

JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
                                                        ^
                                             should be AND, not a comma
шелковый огонь
источник
9

Эта ошибка также может возникнуть, если вы случайно используете =вместо предложения INв WHEREпредложении:

НАПРИМЕР:

WHERE product_id = (1,2,3);
Джей Падалия
источник
1
Или LIKE вместо IN, как я и не мог понять, почему возникает эта ошибка. ty для указателя.
Эдгарс Айварс
Это также может произойти, если вы заключите поля в скобки в предложении SELECT, например, SELECT (Field1, Field2) FROM Table
Пол Крис Джонс,
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)

Ну, вы не можете получить несколько столбцов из одного такого подзапроса. К счастью, второй столбец уже есть 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)
...
Ry-
источник
1

В моем случае проблема заключалась в том, что я по ошибке заключил свой выбор столбцов круглыми скобками:

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;

Звучит глупо, но это было причиной этой ошибки, и потребовалось некоторое время, чтобы понять ее.

Мауро Билотти
источник
Я не могу поверить, что это была моя проблема, я думал, что скобки здесь законны
Джош МакГи
0

Еще одно место, где может произойти эта ошибка, - это присвоение значения с запятой вне строки. Например:

SET totalvalue = (IFNULL(i.subtotal,0) + IFNULL(i.tax,0),0)
iAndy
источник
0

Эта ошибка также может возникнуть, если вы случайно пропустили 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функции!

Джаган Корнана
источник
0
(SELECT users.username AS posted_by,
users.id AS posted_by_id
FROM users
WHERE users.id = posts.posted_by)

Здесь вы используете подзапрос, но этот подзапрос должен возвращать только один столбец. Отделите его, иначе будет отображаться ошибка.

Мошиур Рахман
источник
0

Я получил эту ошибку при выполнении сценария 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
Янак Мина
источник
здесь это не соответствует первому ответу: stackoverflow.com/questions/24551177/…
rubydio
@rubydio, этот вопрос относится к HQL и Hibernate, тогда как мой ответ относится к MySQL в консоли
Intellij