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

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

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

Ответ 1

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

Ответ 2

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

JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
                                                        ^
                                             should be AND, not a comma

Ответ 3

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

НА ПРИМЕРЕ:

WHERE product_id = (1,2,3);

Ответ 4

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

Ответ 5

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

SET totalvalue = (IFNULL(i.subtotal,0) + IFNULL(i.tax,0),0)

Ответ 6

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