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
!