Удалить данные с условием сравнения с другой таблицей

Nuzhser

Новичок
Здравствуйте! С новым годом всех.
У меня потребность удалить данные из одной таблицы но при этом должно соблюдаться условие что в другой будет совпадать значение одноименного поля и при этом значение другого поля в этой же другой таблице будет равно 20.
Имею такой вот запрос но он не работает.
delete from cheese_discount WHERE EXISTS (
SELECT * FROM cheese_discount AS pd
LEFT JOIN cheese_2_category AS ptc
ON (pd.product_id=ptc.product_id)
WHERE ptc.category_id=20
)

Выдает ошибку
#1093 - You can't specify target table 'cheese_discount' for update in FROM clause

Помогите кто чем может ))
 

Ragazzo

TDD interested
Могу помочь добрым словом :) просто через WHERE объединить не получится?
PHP:
WHERE cheese_discount.product_id = cheese_2_category.product_id AND cheese_2_category.category_id = 20
или в чем хитрость?
 

Nuzhser

Новичок
оно почему то не видит имен таблиц с подчеркиванием и когда писать через точку имя поля
выдает
Unknown column 'cheese_2_category.product_id' in 'where clause'
хотя поле такое есть и работает в других запросах где не через точку
 

zerkms

TDD infected
Команда форума
Nuzhser
Что такое "не видит"? Прям так и пишет "ОМГ ОШИБКО, НЕ ВИЖУ ИМЕНИ ТАБЛИЦЫ!!"?

Почему всегда так сложно скопировать и вставить конкретную ошибку (ctrl+c и ctrl+v, 4 нажатия клавиш), но зато не лень своими словами написать какую-то чепуху?

Господа новички, вы специально что ли хотите, чтобы вас упрашивали вас помочь решить вашу же проблему?
 

Ragazzo

TDD interested
Nuzhser
[telepat_mod]экранируй обратными кавычками `` или обычными "" , если pgsql, в нем вроде двойные [/telepat_mod]
вообще да, полный код и данные в студию
 

zerkms

TDD infected
Команда форума
Ragazzo
Двойные кавычки - это по стандарту, так что они должны работать везде (только mysql выпендрился и в нём нужно включать специальный режим для этого)
 

Вурдалак

Продвинутый новичок
Мне кажется твой запрос по задумке эквивалентен
Код:
TRUNCATE TABLE cheese_discount
Ты же LEFT JOIN используешь. А вообще, был бы JOIN, то запрос на обычный DELETE без подзапроса переписывается.

UPD А, вру, у тебя там условие есть.
Код:
DELETE pd.* FROM cheese_discount AS pd JOIN cheese_2_category AS ptc ON ... WHERE ...;
 

Nuzhser

Новичок
Та шо даст код ошибки вот он
#1054 - Unknown column 'cheese_2_category.product_id' in 'where clause'

Но простой запрос типа
SELECT product_id FROM cheese_2_category
работает без проблем

Я его уже вставил ранее вы просто не увидели что я отредактировал сообщение

Подскажите как экранировать
 

Ragazzo

TDD interested
Nuzhser
Если погуглить по запросу "Unknown column in 'where clause'" найдешь подобные проблемы и решение, инфа 146 % :)
 

Nuzhser

Новичок
Спасибо гуглил
Я уже проставил кавычки и все равно не видит колонку после слова WHERE
Мне кажется это потому что оно ищет ее в таблице cheese_discount
Думаю тут нужен вариант посложнее
 

Andkorol

Новичок
Мне кажется это потому что оно ищет ее в таблице cheese_discount
Мне кажется, пора уже показать полностью запрос, который приводит к указанной вами ошибке...(#1054 - Unknown column 'cheese_2_category.product_id' in 'where clause')
Ну, чтоб не гадать, в чём же причина её возникновения...
 

Ragazzo

TDD interested
Вот, специально на 2ух таблицах своих сделал подобное(отработало корректно), разберешься дальше как к себе переделать?
PHP:
DELETE tbl_comment.* FROM tbl_comment,tbl_post WHERE tbl_comment.status = tbl_post.status AND tbl_post.status=2
Andkorol
Мне кажется это потому что оно ищет ее в таблице cheese_discount
 

Nuzhser

Новичок
Извините но уже что то получилось
Вот так работает
delete from cheese_discount WHERE product_id in (
SELECT product_id FROM cheese_2_category
WHERE category_id=20
)
Так работает но вот что делать если мне надо будет перед удалением сравнить еще одно поле с таблицы cheese_discount с полем третьей таблицы на одинаковость
 

Ragazzo

TDD interested
Nuzhser
чем не подошло вот это?
PHP:
DELETE tbl_one.* 
FROM tbl_one,tbl_two,tb_three 
WHERE tbl_one.status = tbl_two.status 
AND tbl_two.status=2 
AND tbl_one.field2 = tb_three.field2 
AND  tb_three.field2 = 'somevalue';
 

HEm

Сетевой бобер
Я всегда, составляя запрос на удаление, где больше, чем одно-два простых условия - делаю селект на данные которые нужно удалить, затем просто меняю синтаксис с SELECT на DELETE
 

Nuzhser

Новичок
но здесь если я правильно понимаю идет удаление из всех таблиц а мен надо из одной
 
Сверху