Ошибка возникает при попытке удаления с помощью select # 1241 - операнд должен содержать 1 столбец (и) - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь удалить много данных через select. Этот выбор подходит для работы и возвращает в результате 75k + строк. Мне нужно удалить их, но когда я пытаюсь удалить, возникает эта ошибка

# 1241 - Операнд должен содержать 1 столбец (и). Я использую PHPMyAdmin.

DELETE FROM `crm_wsal_metadata`
WHERE `occurrence_id` = ANY

(SELECT *
FROM `crm_wsal_metadata`
WHERE `name` = `PostDate` AND `value` BETWEEN str_to_date('2018-12-26', '%Y-%m-%d') AND str_to_date('2020-05-31', '%Y-%m-%d')
GROUP BY `occurrence_id`)

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Я нашел ответ и попробую написать его пошагово:

  1. Почему возникает эта ошибка?

В MySQL, вы не можете изменить ту же таблицу, которую используете в части SELECT. Это поведение задокументировано в http://dev.mysql.com/doc/refman/5.6/en/update.html

Как это сделать?

Есть два способа:


  1. Присоединить таблицу к самой себе

UPDATE tbl AS a INNER JOIN tbl AS b ON .... SET a.col = b.col


Вложите подзапрос глубже в предложение from

UPDATE tbl SET col = ( SELECT ... FROM (SELECT.... FROM) AS x);


Лично в моем случае код выглядел так:
DELETE FROM crm_wsal_metadata WHERE occurrence_id = ANY ( SELECT occurrence_id FROM ( SELECT occurrence_id FROM crm_wsal_metadata WHERE name = "PostDate" AND value BETWEEN str_to_date('2018-12-26', '%Y-%m-%d') AND str_to_date('2020-05-31', '%Y-%m-%d') AS search) )

Простите за такой плохой стиль. Я новичок в этом :)

0 голосов
/ 17 июня 2020

Используйте

... SELECT `occurence_id` ...

вместо SELECT *. Предложение group by заставляет вас использовать только сгруппированные столбцы и агрегации, а не звездочку (возможно, за исключением некоторых проприетарных причуд, на которые я не рекомендую полагаться).

...