Error 1241 mysql

Learn how to fix MySQL error operand should contain 1 column(s)

The error Operand should contain 1 column(s) is most likely caused by a subquery that’s returning more than one column.

Here’s a typical SELECT query that causes this error:

SELECT column_one, 
    (SELECT column_two, column_three FROM table_two) 
  FROM table_one;

The above subquery returns column_two and column_three, so MySQL throws the Operand should contain 1 column(s) error.

Most often, you only need to check your subquery and make sure that it returns only one column.

If you need more guidance on how to fix this MySQL error, then you may read the next section.

How to fix Operand should contain 1 column(s) error

To illustrate an example, imagine you have two tables that have related data named members and pets.

The members table contain the first_name of people who have pets as shown below:

+----+------------+----------------+
| id | first_name | country        |
+----+------------+----------------+
|  1 | Jessie     | United States  |
|  2 | Ann        | Canada         |
|  3 | Joe        | Japan          |
|  4 | Mark       | United Kingdom |
|  5 | Peter      | Canada         |
+----+------------+----------------+

While the pets table contain the owner and the species column as follows:

+----+--------+---------+------+
| id | owner  | species | age  |
+----+--------+---------+------+
|  1 | Jessie | bird    |    2 |
|  2 | Ann    | duck    |    3 |
|  3 | Joe    | horse   |    4 |
|  4 | Mark   | dog     |    4 |
|  5 | Peter  | dog     |    5 |
+----+--------+---------+------+

The first_name and the owner columns are related, so you may use a subquery to display data from both tables like this:

SELECT `first_name` AS `owner_name`, 
  (SELECT `species`, `age` 
    FROM pets WHERE pets.owner = members.first_name) 
  FROM members;

However, the above SQL query is wrong, and it will throw an error like this:

ERROR 1241 (21000): Operand should contain 1 column(s)

This is because MySQL expects the subquery to return only one column, but the above subquery returns two.

To fix the error, you may create two subqueries with each subquery returning only one column as in the following SELECT statement:

SELECT `first_name` AS `owner_name`, 
  (SELECT `species` 
    FROM pets WHERE pets.owner = members.first_name) AS `species`,
  (SELECT `age` 
    FROM pets WHERE pets.owner = members.first_name) AS `age`  
  FROM members;

While the above query works, it will throw another error once the subquery returns more than one row.

Let’s add another pet that’s owned by “Jessie” to the pets table as shown below:

+----+--------+---------+------+
| id | owner  | species | age  |
+----+--------+---------+------+
|  1 | Jessie | bird    |    2 |
|  2 | Ann    | duck    |    3 |
|  3 | Joe    | horse   |    4 |
|  4 | Mark   | dog     |    4 |
|  5 | Peter  | dog     |    5 |
|  6 | Jessie | cat     |    4 |
+----+--------+---------+------+

Now the subqueries will return two species and age rows for “Jessie”, causing another related error:

mysql> SELECT `first_name` AS `owner_name`, 
   ->   (SELECT `species` 
   ->     FROM pets WHERE pets.owner = members.first_name) 
   ->   FROM members;
ERROR 1242 (21000): Subquery returns more than 1 row

To properly fix the error, you need to replace the subquery with a JOIN clause:

SELECT `first_name` AS `owner_name`, `species`, `age`
  FROM members JOIN pets 
  ON members.first_name = pets.owner;

Subqueries can be used to replace JOIN clauses only when you need to SELECT data from one table, but you need to filter the result by another table column.

For example, maybe you have some owner names in the pets table that aren’t recorded in the members table. You can use a subquery in the WHERE clause to display rows in the pets table that are also recorded in the members table.

Here’s an example of using a subquery in the WHERE clause:

SELECT `owner`, `species`, `age` 
  FROM pets 
  WHERE `owner` IN (SELECT `first_name` FROM members);

Without using a subquery, you need to JOIN the table as shown below:

SELECT `owner`, `species`, `age` 
  FROM pets JOIN members 
  ON pets.owner = members.first_name;

The two queries above will produce the same result set.

And that’s how you can fix the Operand should contain 1 column(s) error in MySQL.

You need to check your subquery before anything else when you encounter this error.

fezarmon

Fezarmon

@fezarmon

Начинающий программист

вот сам запрос

SELECT * FROM `board` WHERE moder=0 AND activ=0 AND id_akk IN (SELECT user_id_to, user_id_from FROM `podpiski` WHERE user_id_from='38')

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


  • Вопрос задан

    более года назад

  • 954 просмотра


Комментировать


Решения вопроса 1

fezarmon

Fezarmon

@fezarmon Автор вопроса

Начинающий программист

SELECT * 
FROM `board` 
WHERE moder=0 AND activ=0 AND id_akk IN (SELECT user_id_to
                                         FROM `podpiski` 
                                         WHERE user_id_from='38'
                                         union
                                         SELECT user_id_from
                                         FROM `podpiski` 
                                         WHERE user_id_from='38')


Комментировать

Пригласить эксперта


Похожие вопросы


  • Показать ещё
    Загружается…

09 февр. 2023, в 14:22

1500 руб./за проект

09 февр. 2023, в 13:58

2000 руб./за проект

09 февр. 2023, в 13:28

777 руб./за проект

Минуточку внимания

sql – MySQL error 1241: Operand should contain 1 column(s)

Syntax error, remove the ( ) from select.

insert into table2 (name, subject, student_id, result)
select name, subject, student_id, result
from table1;

Just remove the ( and the ) on your SELECT statement:

insert into table2 (Name, Subject, student_id, result)
select Name, Subject, student_id, result
from table1;

sql – MySQL error 1241: Operand should contain 1 column(s)

Another way to make the parser raise the same exception is the following incorrect clause.

SELECT r.name
FROM roles r
WHERE id IN ( SELECT role_id ,
                     system_user_id
                 FROM role_members m
                 WHERE r.id = m.role_id
                 AND m.system_user_id = intIdSystemUser
             )

The nested SELECT statement in the IN clause returns two columns, which the parser sees as operands, which is technically correct, since the id column matches values from but one column (role_id) in the result returned by the nested select statement, which is expected to return a list.

For sake of completeness, the correct syntax is as follows.

SELECT r.name
FROM roles r
WHERE id IN ( SELECT role_id
                 FROM role_members m
                 WHERE r.id = m.role_id
                 AND m.system_user_id = intIdSystemUser
             )

The stored procedure of which this query is a portion not only parsed, but returned the expected result.

Related posts on MySQL Error :

  • MySQL error code: 1175 during UPDATE in MySQL Workbench
  • MySQL Error Operand should contain 1 column
  • MySQL ERROR 1290 (HY000) –secure-file-priv option
  • mysql error 1364 Field doesnt have a default values
  • sql – MySQL Error 1264: out of range value for column
  • sql – MySQL error: key specification without a key length
  • mySQL Error 1040: Too Many Connection
  • php – mysql error TYPE=MyISAM

5 ответов

Проблема заключается в том, что ваш внутренний запрос возвращает два столбца. Измените свой запрос, например

UPDATE ADRESSEN
SET EMAIL = 0
WHERE ID = (SELECT ID
FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" 
GROUP BY ID
HAVING COUNT(ID) = 1)

Это должно сработать.

У меня есть еще одно предложение: вы уверены, что ваш внутренний запрос всегда будет возвращать одну строку?
Если вы хотите установить EMAIL со значением 0 для нескольких идентификаторов, возвращаемых внутренним запросом, я бы рекомендовал использовать «IN» вместо «=».

sak
14 март 2012, в 18:53

Поделиться

В вашем подзапросе содержатся два столбца. Попробуйте следующее:

UPDATE ADRESSEN
SET EMAIL = 0
WHERE ID = (SELECT ID
FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" 
GROUP BY ID
HAVING COUNT(ID) = 1)

Я удалил COUNT(ID), поэтому вы выбираете только идентификатор и вместо этого помещаете его в предложение HAVING.

Кроме того, если вы не уверены, что этот запрос никогда не вернет более одной строки, вам нужно иметь дело с возможностью дублирования. Либо измените на WHERE ID IN вместо WHERE ID =, либо ограничьте количество результатов, возвращаемых запросом. Метод ограничения результатов будет зависеть от ваших требований — добавление LIMIT 1 к подзапросу будет работать, но вы можете захотеть сделать некоторую сортировку или использовать MIN/MAX, чтобы указать, какую строку вы получите.

Ryan P
14 март 2012, в 18:36

Поделиться

Проблема с вашим подзапросом:

SELECT ID, COUNT(ID) AS COUNTER FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" GROUP BY ID HAVING COUNTER = 1

вы пытаетесь сравнить его с ID, но возвращаете два столбца

James C
14 март 2012, в 18:47

Поделиться

UPDATE ADRESSEN
SET EMAIL = 0
WHERE ID = (SELECT ID
FROM EIGENSCHAFTEN WHERE Kategorie = "BOUNCE" 
GROUP BY ID
HAVING COUNT(*) = 1)

Teja
14 март 2012, в 19:38

Поделиться

WHERE ID IN (SELECT ID 
                FROM EIGENSCHAFTEN 
                WHERE Kategorie = "BOUNCE" 
                GROUP BY ID
                HAVING COUNT(*) = 1 )

DRapp
14 март 2012, в 18:44

Поделиться

Ещё вопросы

  • 1Spring использует провайдера анонимной аутентификации для использования гостевого пользователя
  • 0jQuery Изменение дочерних элементов в содержимом iFrame
  • 1Как получить доступ к одним и тем же данным на нескольких контроллерах?
  • 0sql: фильтровать результаты строки по верхнему регистру
  • 0Запрос Sql для выбора самых последних в одной или многих отношениях двух таблиц
  • 1Измените String на Float с («») в строке [duplicate]
  • 1FileIO из ArrayList
  • 1@ Inject не вводит и вызывает исключение NullPointerException при использовании компонентного сканирования
  • 0Почему array_map не работает здесь?
  • 0Сохранение ввода из предыдущей формы в новую форму
  • 0Как вызвать демонстрационный URL с помощью VinceG php-first-data-api
  • 0AngularStrap — загрузить файл шаблона в модальный шаблон как внутренний контент
  • 0Как перебрать множество пар значений JSON-объект
  • 1Нужно регулярное выражение, совпадающее с текстовой строкой, которая может слегка отличаться в интервале
  • 0Как получить атрибут раскрывающегося списка в jquery
  • 0Есть проблема с моим векторным объявлением / зацикливанием / чем-то, но я не уверен, что это
  • 0Преобразование формата даты возвращает «ноль» в конструкторе запросов Kohana
  • 1Преобразование различных категориальных переменных в фиктивные переменные
  • 0Как вывести файлы CPP из ProC в Solaris?
  • 0JQuery динамически добавленный текст не будет загружать стиль веб-шрифта
  • 1Я создавал веб-сервис WCF и застрял в методах Post & Put, где Get работает нормально. Я добавил в него .edmx. Любое решение?
  • 0Двойные звонки от рендера
  • 1Javascript — поиск аудио в определенную позицию, когда в точном положении в звуковой дорожке
  • 0Ng-класс не оценивает данный аргумент
  • 1SqlDependency выберите сегодня записи
  • 0PHP Замена символа внутри строки с переменной
  • 0DevExtreme и DxMap и DxDataGrid
  • 0Карты Google не отображаются в IE / FF
  • 1Проблемы с относительным размещением в Android
  • 0Ошибка запуска ApplicationContext. Для отображения отчета автоконфигурации перезапустите ваше приложение с включенной отладкой. использование netbeans / Spring
  • 1Ошибка вызова метода Vue через Vue Computed
  • 1Удалить все строки, которые являются дубликатами по отношению к некоторым строкам
  • 0Строгие стандарты: только переменные должны передаваться по ссылке? [Дубликат]
  • 0SQL для выбора с определенной длиной критериев суммы результатов
  • 1Сцепление наблюдаемых с flatMap
  • 1падающие домино, отладка
  • 0Невозможно скрыть элемент div с помощью Jquery
  • 0SQL Получить значение из другой таблицы через идентификатор и отобразить общее
  • 0измените codeigniter .htaccess на ошибку web.config
  • 0Как добавить имя файла экспорта csv в запрос MySQL?
  • 1Можно ли закрепить индикатор выбора вкладки TabLayout в верхней части экрана при прокрутке?
  • 1Java — правильная проверка пересечения линии
  • 1GroupBox не отображается правильно на темном фоне в WPF
  • 1android — переход от первого экрана к другому, выполняется с помощью Intent, но затмение дает некоторую ошибку
  • 0Использование плагина readmore.js с динамически создаваемым тегом div
  • 1Создание ярлыка на андроид
  • 1Как изменить цвет текста при нажатии кнопки?
  • 1Эффективный формат для хранения диапазона значений в базе данных
  • 0Javascript удалить необходимый атрибут работает смешанным образом
  • 0Yii ActiveRecord и консольные команды не работают

За последние 24 часа нас посетили 11525 программистов и 1159 роботов. Сейчас ищут 211 программистов …


  1. engine.energy

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0

    Почему так не работает?

    Хотел получить рецепт и список требование для рецепта.

    Ошибка: Fatal error: Uncaught exception ‘PDOException’ with message ‘SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)’ in

    1. «SELECT `recipes`.*, (SELECT * FROM `recipe_components` WHERE `item_id` = :item_id) AS components FROM `recipes` WHERE `id` = :item_id LIMIT 1»

    :item_id в PDO!


  2. Deonis

    С нами с:
    15 фев 2013
    Сообщения:
    1.523
    Симпатии:
    504

    Ошибка 1241 говорит о том, что у вас неверное число столбцов в подзапросе. Допустимо применять подзапросы, которые возвращают несколько столбцов с целью сравнения, но в других контекстах подзапрос должен быть скалярным операндом.
    Короче, я не знаю что и как у вас устроено в таблицах и какой результат вы хотите получить, но пробуйте сделать запрос с помощью UNION / UNION ALL или JOIN. Например:

    1.     `recipes`.*, `recipe_components`.* 
    2.     `recipe_components` ON (`recipe_components`.`item_id` = `recipes`.`id`)


  3. artoodetoo

    Команда форума
    Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.827
    Симпатии:
    1.174
    Адрес:
    там-сям

    отличное объяснение! только обращу внимание на то, что колонка id, как правило, есть в каждой таблице. поэтому в данном контексте её нельзя упоминать без привязки к таблице/алиасу. вероятно надо так:
    … WHERE `recipes`.`id` = :item_id

    Добавлено спустя 5 минут 8 секунд:
    еще своих домыслов добавлю.
    насколько я понимаю, рецепт и требования к рецепту относятся как один-ко-многим. когда мы клеим их джойном, мы получаем записи со множеством повторов из таблицы recipes. возможно для странички с конкретным рецептом (`recipes`.`id` = :item_id) нет смысла в таком джойне. хотя это не ошибка.
    удобнее будет обработать два отдельных запроса: получить одну строчку из recipes и несколько из recipe_items.


  4. engine.energy

    С нами с:
    31 май 2015
    Сообщения:
    149
    Симпатии:
    0

    Deonis, Я хотел получить компоненты для рецепты.
    Например у компонент для 1 рецепты имеет:
    1. Пила
    2. Бревно
    Каждый рецепт требует компоненты чтобы сделать вещи.

    Если из компоненты не хватает то рецепт не будет выполнять создание вещи «Доска»


  5. artoodetoo

    Команда форума
    Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.827
    Симпатии:
    1.174
    Адрес:
    там-сям

    engine.energy, это всё итак было понятно. тебе Deonis уже ответил по существу: из-за чего ошибка происходит и как можно переписать запрос чтобы получить все компоненты рецепта.

    Добавлено спустя 6 минут 32 секунды:
    Ещё вариант: получаем список названий компонент в строку через запятую

    1. SELECT r.*, c.`components`
    2.     SELECT  `item_id`, GROUP_CONCAT(`recipe_components`.`name`) AS `components` 
    3.   ) AS c ON (c.`item_id` = r.`id`)

    Здесь я предположил, что поле с название компоненты `name`. Если оно другое, просто замени имя.

Понравилась статья? Поделить с друзьями:
  • Error 1241 21000 operand should contain 1 column s
  • Error 124 373 xerox
  • Error 123 the filename directory name or volume label syntax is incorrect
  • Error 123 getlasterror
  • Error 1227 mysql