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

Дякую за відповідь. Я виправлю свій запит і позначу вас як відповідь, але як для введення, чи вважаєте ви, що існує "кращий" спосіб написати мій запит, ніж той, що я використовую зараз (але також не враховуючи помилку в ньому)?

Ага. Дякуємо за редагування вашого оригінального допису. Я обов’язково позначу вас як відповідь, коли StackOverflow дозволить. Дуже дякую!

Ну, COUNT()це трохи скидає справи; запит, який я дав, можливо, спричинить помилку через агрегування. Можливо, вам доведеться перемістити це узагальнення в підзапит, залежно від цілей вашого запиту (які на даний момент мені незрозумілі).
cdhowie

17

Ця помилка може також статися, якщо ви випадково використовуєте коми замість ANDу ONреченні a 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 для вказівника.
Edgars Aivars

Це також може статися, якщо ви ставите дужки навколо полів у реченні 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)
...

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)

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 у 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
Janac Meena
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.