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

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

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

5 58

5 ответов:

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

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

JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
                                                        ^
                                             should be AND, not a comma
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)
...

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

НАПРИМЕР:

WHERE product_id = (1,2,3);

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

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